7

我搜索了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

使用 having >1 似乎并没有真正捕捉到这一点,有什么想法吗?谢谢。

4

7 回答 7

7

使用having count(*) > 1只是难题的一半。另一半正在获取相应的行。

你可以这样做:

SELECT *
FROM MyTable
WHERE ColumnA IN (
    SELECT ColumnA FROM MyTable GROUP BY ColumnA HAVING COUNT(*) > 1
)
于 2013-08-29T01:48:06.627 回答
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);

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

于 2013-08-29T01:54:29.347 回答
1

我通常喜欢避免在查询中多次访问表——即使没有索引也能很好地工作——只对表进行一次扫描:

SELECT columnA, columnB, columnC
FROM (SELECT mytable.*
            ,COUNT(*) OVER (PARTITION BY columnA) countA
      FROM mytable)
WHERE countA > 1
于 2013-08-29T02:36:31.203 回答
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

在此处查看@Quassnoi 的原始答案。感谢他,使用分区的一个非常聪明的解决方案。

于 2015-04-23T04:31:18.527 回答
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 
于 2013-08-29T01:47:56.703 回答
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;
于 2013-08-29T01:48:24.207 回答
0

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

这里:TICKETID 是一个主键,TKTNUMBER 可以出现多次。

CREATE TABLE TEMP
(
   TICKETID    FLOAT,
   TKTNUMBER   FLOAT
);

CREATE TABLE TEMP2
(
   TKTNUMBER   FLOAT,
   COUNTER     INTEGER
);

通过仅查看 COUNT(TKTNUMBER)>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
于 2016-05-23T09:48:23.890 回答