Oracle SQL如何选择多列重复项,拆分它们的ID?

Oracle SQL如何选择多列重复项,拆分它们的ID?,sql,oracle,duplicates,Sql,Oracle,Duplicates,数据库中存在一些功能重复项 也就是说,在一个示例表中,如果列country、color和type相同,则将其计为同一行 我想把这些复制品拿出来 因此,给出示例表: Clothes ID COUNTRY COLOR TYPE 11 China Blue PJ 22 Spain Red Pants 39 Spain Grey Pants 51 Spain G

数据库中存在一些功能重复项

也就是说,在一个示例表中,如果列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
70   11
22   94
使用不同的:

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;
选择不同的最小值(t1.id,t2.id)作为id_1,最大值(t1.id,t2.id)作为id_2
来自服装t1
左连接衣服t2
在t1.type=t2.type和t1.country=t2.country和t1.color=t2.color上
其中t1.id t2.id;

只需使
连接
-条件不对称即可:

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作为id_1,选择t2.id作为id_2
来自服装t1
左连接衣服t2
在t1.type=t2.type和t1.country=t2.country和t1.color=t2.color上
其中t1.id

要求
t1.id
将防止出现“交换”对。

我认为Listag将解决您的问题

您需要具有相同国家、颜色和类型组合的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;
这将处理两个以上重复项的情况。在查询中,使用join。因此,要处理2个以上的重复项,必须使用多个自联接

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;