【问题标题】:SQL - left join generate duplicatesSQL - 左连接生成重复
【发布时间】:2014-07-29 18:43:24
【问题描述】:

我有代码可以选择一些应用程序,但 LEFT JOIN 正在创建重复项。

问题:如何去除由

产生的重复
LEFT JOIN
    attachments as att
ON 
    (a.ssn = att.ssn AND att.doc_type = 'id_copy' AND att.source = 'cpt3')

我的工作:

我正在考虑 SELECT DISTINCT 或 GROUP BY,但不知道将它们放在哪里。

这是查询:

SELECT
        a.*, c.code, l.who, l.locked_time, att.id AS attnew, 
        ( SELECT 
            COUNT(*) 
          FROM 
            applications as a2 
          WHERE 
            a2.approved = 'Y' 
          AND 
            a2.paid = 'Y' 
          AND 
            a2.paid_back = 'Y' 
          AND 
            a2.ssn = a.ssn 
        ) AS previous_apps
    FROM 
        applications as a
    LEFT JOIN 
        locked_by as l 
    USING(id) 
    LEFT JOIN 
        campaign_codes as c 
    ON 
        c.id = a.campaign
    LEFT JOIN
        attachments as att
    ON 
        (a.ssn = att.ssn AND att.doc_type = 'id_copy' AND att.source = 'cpt3')
    WHERE 
        a.closed='N' 
    AND 
        a.paid = 'N' 
    ORDER BY 
        a.arrived_date 
    DESC

【问题讨论】:

  • SQL 标签下目前大约有 2636 个关于JOIN 和重复行的问题。很难想象这不是其中至少一个的复制品。

标签: sql duplicates left-join


【解决方案1】:

使用GROUP BY

避免重复。在你的情况下:

...
    WHERE 
        a.closed='N' 
    AND 
        a.paid = 'N' 
    GROUP BY
        a.id
    ORDER BY 
        a.arrived_date 
    DESC

【讨论】:

    【解决方案2】:

    如果您想建立一对一的关系以避免重复,并且att.id 对于每个att.ssn 都是相同的,或者您只需要一个(MAX、MIN、..ANY?)att.id。试试这个:

    LEFT JOIN
            (SELECT ssn,
                    MAX(id) as id,
               FROM attachments 
               WHERE doc_type = 'id_copy' AND source = 'cpt3'
               GROUP BY ssn
             )as att
        ON 
            (a.ssn = att.ssn)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-02
      • 2021-12-07
      • 1970-01-01
      • 2015-08-02
      • 2016-01-13
      • 2011-12-11
      • 2013-01-14
      相关资源
      最近更新 更多