【问题标题】:Oracle SQL How to select multi column duplicates, splitting up their ids?Oracle SQL 如何选择多列重复项,拆分它们的 id?
【发布时间】:2017-06-13 15:08:29
【问题描述】:

数据库中有一些功能重复。

IE,在一个示例表衣服中,如果列 country、color 和 type 相同,则计为同一行。

我想取出这些重复的。

所以给出示例表:

Clothes
ID      COUNTRY     COLOR   TYPE
11      China       Blue    PJ
22      Spain       Red     Pants
39      Spain       Grey    Pants       
51      Spain       Grey    Pants                   
70      China       Blue    PJ
94      Spain       Red     Pants

我使用以下查询:

SELECT t1.id AS id_1, t2.id AS id_2
FROM clothes t1
LEFT JOIN clothes t2
    ON t1.type = t2.type AND t1.country = t2.country AND t1.color = t2.color
WHERE t1.id <> t2.id;

这会导致

id_1 id_2
51   39
39   51
70   11
11   70
22   94
94   22

问题:有什么办法可以避免重复行吗? IE,我想要的是这样的:

id_1 id_2
51   39
70   11
22   94

【问题讨论】:

    标签: sql oracle duplicates


    【解决方案1】:

    使用不同的:

    SELECT distinct least(t1.id, t2.id) AS id_1, greatest(t1.id, t2.id) AS id_2
    FROM clothes t1
    LEFT JOIN clothes t2
        ON t1.type = t2.type AND t1.country = t2.country AND t1.color = t2.color
    WHERE t1.id <> t2.id;
    

    【讨论】:

      【解决方案2】:

      只要使join-condition 不对称就可以了:

      SELECT t1.id AS id_1, t2.id AS id_2
      FROM clothes t1
      LEFT JOIN clothes t2
      ON t1.type = t2.type AND t1.country = t2.country AND t1.color = t2.color
      WHERE t1.id < t2.id;
      

      要求t1.id &lt; t2.id 将阻止“交换”对出现。

      【讨论】:

        【解决方案3】:

        我认为 ListAgg 会解决您的问题。

        您需要具有相同国家、颜色和类型组合的 id。

        WITH clothes AS
             (SELECT 11 ID, 'China' country, 'Blue' color, 'PJ' TYPE
                FROM DUAL
              UNION
              SELECT 22 ID, 'Spain' country, 'Red' color, 'Pants' TYPE
                FROM DUAL
              UNION
              SELECT 39 ID, 'Spain' country, 'Grey' color, 'Pants' TYPE
                FROM DUAL
              UNION
              SELECT 51 ID, 'Spain' country, 'Grey' color, 'Pants' TYPE
                FROM DUAL
              UNION
              SELECT 70 ID, 'China' country, 'Blue' color, 'PJ' TYPE
                FROM DUAL
              UNION
              SELECT 94 ID, 'Spain' country, 'Red' color, 'Pants' TYPE
                FROM DUAL)
        SELECT   country, color, TYPE,LISTAGG(ID, ', ') WITHIN GROUP (ORDER BY ID) id_list
            FROM clothes
        GROUP BY country, color, TYPE;
        

        这将处理超过 2 个重复项的情况。在您的查询中,使用了连接。因此,要处理超过 2 个重复项,您必须使用多个自连接。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-11-14
          • 2021-03-27
          • 2013-12-21
          • 2013-05-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多