2017-06-13 36 views
0

數據庫中有一些功能重複。Oracle SQL如何選擇多列重複項,分割它們的ID?

IE中,在一個示例表格中,如果列的國家,顏色和類型相同,則它計爲同一行。

我想拉出這些重複項。

所以給出的示例表:

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 

回答

0

用途不同:

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; 
0

就使得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 < t2.id將防止「交換」對出現。

0

我認爲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個以上的重複,你必須使用多個自連接。