在Oracle SQL列中查找重复项

时间:2013-08-29 01:44:05

标签: sql oracle

我搜索了Find duplicate entries in a columnOracle: find duplicate rows in select query,但似乎无法得到任何答案......

我有一些看起来像这样的数据

columnA    columnB    columnC
1111111    emailID1   true
1111111    emailID2   false
1111222    emailID3   true
1111339    emailID4   true
2384398    emailID5   true

我想只显示这些列在columnA中具有相同值但在columnB和/或C中可能不同的列:

columnA    columnB    columnC
1111111    emailID1   true
1111111    emailID2   false

使用有> 1似乎并没有抓住这个,任何想法? 感谢。

7 个答案:

答案 0 :(得分:7)

使用having count(*) > 1只是谜题的一半。另一半是得到相应的行。

你可以这样做:

SELECT *
FROM MyTable
WHERE ColumnA IN (
    SELECT ColumnA FROM MyTable GROUP BY ColumnA HAVING COUNT(*) > 1
)

答案 1 :(得分:5)

试试这个:

SELECT t.*
FROM (SELECT ColumnA FROM MyTable GROUP BY ColumnA HAVING COUNT(*) > 1) dups
JOIN MyTable t ON t.ColumnA = dups.ColumnA

只要索引在ColumnA

,这也可以很好地扩展
create index MyTable_ColumnA on MyTable(ColumnA);

这样的索引将用于主查询和内部查询,为您提供非常好的性能。

答案 2 :(得分:1)

我通常希望避免在查询中多次访问表 - 即使没有索引也能正常工作 - 只对表执行一次扫描:

SELECT columnA, columnB, columnC
FROM (SELECT mytable.*
            ,COUNT(*) OVER (PARTITION BY columnA) countA
      FROM mytable)
WHERE countA > 1

答案 3 :(得分:0)

SELECT T.columnA, S.columnB, S.columnC FROM
(
SELECT columnA FROM someTable 
GROUP BY columnA
HAVING COUNT(*) > 1
) T INNER JOIN someTable S ON T.columnA = S.columnA 

答案 4 :(得分:0)

您可以使用分析功能执行此操作。找到最小值和最大值并返回它们不同的行:

select columnA, columnB, columnC
from (select t.*,  min(t.columnC) over (partition by columnA, columnB) as minC,
             max(t.columnC) over (partition by columnA, columnB) as maxC
      from t
     ) t
where minC <> maxC;

答案 5 :(得分:0)

这个帖子可能已经过时但是值得更新每个人更好/更有效的解决方案来查找重复记录。您可以使用分区查找匹配列上的重复记录(根据需要使用多个列而不使用内部联接)。

SELECT  *
FROM    (
        SELECT  t.*, ROW_NUMBER() OVER (PARTITION BY column1, column2 ORDER BY your_key_column) AS duplicate_count
        FROM    yourtable t
        )
WHERE   duplicate_count > 1 --get duplicate records for the matching value in column1 and column2

见@ here @Quassnoi的原始答案。感谢他,使用分区非常聪明的解决方案。

答案 6 :(得分:0)

如果您要查找数据库中具有唯一ID的条目,其中列中可能出现多个键,那么找到它们的一种简单方法是创建两个表,如下面所示:

此处:TICKETID是主键,TKTNUMBER可以多次出现。

CREATE TABLE TEMP
(
   TICKETID    FLOAT,
   TKTNUMBER   FLOAT
);

CREATE TABLE TEMP2
(
   TKTNUMBER   FLOAT,
   COUNTER     INTEGER
);

只需使用COUNT(TKTNUMBER)&gt; 1查看TKTNUMBERS,即可输入所有TICKETID和TKTNUMBER:

INSERT INTO TEMP
   SELECT 
       TICKETID, 
       TKTNUMBER
   FROM YOUR_TABLE
   WHERE TKTNUMBER IN (  
            SELECT TKTNUMBER
            FROM YOUR_TABLE
            HAVING COUNT (TKTNUMBER) > 1
            GROUP BY TKTNUMBER);

最后,要查看计数器,请按照与上述相同的方式输入TKTNUMBER和COUNT:

INSERT INTO TEMP2
    SELECT 
        TKTNUMBER, 
        COUNT (TKTNUMBER) AS COUNTER
    FROM YOUR_TABLE
    HAVING COUNT (TKTNUMBER) > 1
    GROUP BY TKTNUMBER
    ORDER BY 2 DESC

您可以选择如下(通过连接tktnumber上的两个表):

SELECT 
    T1.TICKETID,
    T1.TKTNUMBER,
    T2.COUNTER
FROM 
    TEMP T1 INNER JOIN 
    TEMP2 T2 ON 
        T2.TKTNUMBER = T1.TKTNUMBER
ORDER BY T2.COUNTER DESC
相关问题