2013-08-29 106 views
6

...我已经寻找Find duplicate entries in a columnOracle: find duplicate rows in select query,但也似乎没有得到任何答案...查找列重复项目的Oracle SQL

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

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并没有真正似乎captu重新这个,任何想法? 谢谢。

+0

顺便说一句,我只在一张桌子上搜索这个,不需要连接。 :) –

+0

提出的一些解决方案涉及*自连接*,因此连接*是针对您的问题的有效解决方案。 –

回答

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 
7

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

你可以这样说:

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

+1,但是你也可以通过加入你的子选择来实现,这可以扩展。 – Bohemian

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

试试这个:

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); 

这样的索引将用于主要查询和内部查询,给你非常好的性能。

+1

+1尽管我更喜欢“IN”的外观,但我100%同意“JOIN”可以减少对优化器的依赖。 – dasblinkenlight

+0

不幸的是我没有加入2张桌子...... –

+1

当然不是 - 在这种情况下,建议是将一张桌子加入自己。内部查询标识重复的行,外部查询收集结果中您想要的其他列。 –

1

我平时喜欢以避免打表比一次查询更多 - 这将很好地工作,甚至没有索引 - 在桌子上做只有一个扫描:

SELECT columnA, columnB, columnC 
FROM (SELECT mytable.* 
      ,COUNT(*) OVER (PARTITION BY columnA) countA 
     FROM mytable) 
WHERE countA > 1 
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在here。感谢他,通过使用分区非常聪明的解决方案。

0

如果你正在寻找一个独特的ID在你的数据库中,其中一列多个键可以出现,然后输入一个简单的方法找到他们是创建两个表像exlplained如下:

这里:TICKETID是主键,TKTNUMBER可以发生多次。

CREATE TABLE TEMP 
(
    TICKETID FLOAT, 
    TKTNUMBER FLOAT 
); 

CREATE TABLE TEMP2 
(
    TKTNUMBER FLOAT, 
    COUNTER  INTEGER 
); 

把所有的TICKETID的和TKTNUMBER的与指望TKTNUMBERS只想找(TKTNUMBER)> 1:

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