在多个列ORACLE中查找重复值

时间:2014-04-16 11:18:39

标签: sql oracle oracle11g

我有以下表结构

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

我正在尝试在ORACLE中编写一个SQL脚本来按ID计算重复记录。如果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 

2 个答案:

答案 0 :(得分: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
            )

<强>解释

如果任何列TYPE1,TYPE2或TYPE3具有不同的值,

ROW_NUMBER() OVER( PARTITION BY ID ORDER BY TYPE1, TYPE2, TYPE3)将为行生成不同的序列号 seqNum

答案 1 :(得分: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;