2014-04-16 161 views
0

查找重複值的多個列ORACLE

Columns: ID, FKID, NAME, TYPE1, TYPE2, TYPE3 

我試圖寫在Oracle SQL腳本,通過編號來計算重複記錄如下表結構。這是很簡單,如果TYPE1是到處都一樣,但重複的值可能在TYPE1,TYPE2或TYPE3 - 因此,例如下面兩行應返回的重複行:

ID: 1, FKID: 1, NAME: Example1, TYPE1: 01, TYPE2: 02, TYPE3: 03 
ID: 1, FKID: 1, NAME: Example2, TYPE1: 02, TYPE2: 03, TYPE3: 01 
+0

如果TYPE1是不是在兩個不同的行相同,則必須在TYPE1,TYPE2和TYPE3都有第二排的匹配值還是足以使它們只是一個以配合第二排被限定爲重複行? –

回答

0
SELECT * 
FROM tableName 
WHERE ID IN (
      SELECT ID FROM 
          (
          SELECT ID 
          ROW_NUMBER() OVER(PARTITION BY ID ORDER BY TYPE1, TYPE2, TYPE3) as seqNum 
          FROM tableName 
          ) Z 

      WHERE seqNum>1 
      ) 

解釋

ROW_NUMBER() OVER(PARTITION BY ID ORDER BY TYPE1, TYPE2, TYPE3)將產生不同的序列號爲行SEQNUM如果任何列TYPE1,TYPE2或TYPE3的具有不同的值。

0

以下查詢執行自聯接,並將TYPE1,TYPE2和TYPE3與其他行的TYPE1,TYPE2和TYPE3進行匹配。如果匹配,則選擇該行,最後,通過分組獲得每個ID的行數。

SELECT mt1.ID, COUNT(mt1.ID) 
    FROM mytable mt1 
    INNER JOIN mytable mt2 
    ON mt1.ID = mt2.ID AND (mt1.TYPE1 = mt2.TYPE1 OR mt1.TYPE1 = mt2.TYPE2 OR mt1.TYPE1 = mt2.TYPE3 OR mt1.TYPE2 = mt2.TYPE2 OR mt1.TYPE2 = mt2.TYPE3 OR mt1.TYPE3 = mt2.TYPE3) 
    AND mt1.NAME <> mt2.NAME 
    GROUP BY mt1.ID;