查询返回重复行

时间:2017-06-29 15:24:42

标签: sql sql-server

我写了这个查询

SELECT DISTINCT 
    F2_FILIAL, F2_SERIE, F2_DOC, 
    C6_NUM, AB7_NUMOS, A1_NOME, F2_EMISSAO, F2_VALBRUT, F2_VEND1, 
    A3_NOME,F2_COND , E4_DESCRI, C5_NATUREZ, ED_DESCRIC, AAG_DESCRI
FROM 
    SF2010 SF 
LEFT JOIN 
    SE4010 SE ON F2_COND = E4_CODIGO 
LEFT JOIN 
    SA3010 A3 ON F2_VEND1 = A3_COD 
LEFT JOIN 
    SA1010 A1 ON F2_CLIENTE = A1_COD 
LEFT JOIN 
    SD2010 SD ON F2_DOC = D2_DOC 
LEFT JOIN 
    SC6010 C6 ON D2_PEDIDO = C6_NUM 
LEFT JOIN 
    SC5010 C5 ON D2_PEDIDO = C5_NUM 
LEFT JOIN 
    SED010 ED ON C5_NATUREZ = ED_CODIGO 
LEFT JOIN 
    AB7010 AB ON SUBSTRING(C6_NUMOS,1,6) = AB7_NUMOS 
LEFT JOIN 
    AAG010 AG ON AB7_CODPRB = AAG_CODPRB 
WHERE 
    (F2_CLIENTE >= '      ' 
     AND F2_CLIENTE <= 'zzzzzz') 
    AND (F2_EMISSAO >= '20170222'
         AND F2_EMISSAO <= '20170222')
    AND (F2_VEND1 >= '' 
         AND F2_VEND1 <= 'zz') 
    AND (C5_NATUREZ >= '' 
         AND C5_NATUREZ <= 'zzzzzzzzzz') 
    AND (F2_COND >= '' 
         AND F2_COND <= 'zzz') 
    AND (F2_FILIAL >= '' 
         AND F2_FILIAL <= 'zz') 
    AND (SF.D_E_L_E_T_ <> '*') 
    AND F2_DUPL <> '' 
    AND F2_VALFAT <> 0 
ORDER BY 
    F2_VEND1, F2_EMISSAO

结果是这样的:

query result

请注意,最后两行是相同的(这里的主要字段是F2_DOC,它应该永远不会出现两次),但由于字段C6_NUM和AB7_NUMOS有多个引用,它会显示两个引用,复制该行。 / p>

当我正在加入的表格与我正在查询的表格有多于1个不同的FK时,如何改进我的查询以不复制行?

1 个答案:

答案 0 :(得分:0)

如果您正在进行多个左连接并且连接中的leftest表没有(或者在select中没有提到)一个唯一值,则可能会出现重复的行。如果你需要一个唯一的列,请使用select语句中leftest表中的主键或添加一个列     row_number()作为id 对你的查询。

相关问题