2014-04-16 279 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;