Oracle SQL如何选择多列重复项,拆分它们的ID?
数据库中存在一些功能重复项 也就是说,在一个示例表中,如果列country、color和type相同,则将其计为同一行 我想把这些复制品拿出来 因此,给出示例表: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
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;