2008-10-13 43 views
41

什麼是快速SQL的例子,以便在數十萬個記錄的數據集中獲取重複數據。我通常使用類似的東西:最快的「獲取重複數據」SQL腳本

SELECT afield1, afield2 FROM afile a 
WHERE 1 < (SELECT count(afield1) FROM afile b WHERE a.afield1 = b.afield1); 

但這是相當緩慢。

回答

74

這是更直接的方式:

select afield1,count(afield1) from atable 
group by afield1 having count(afield1) > 1 
15

你可以嘗試:

select afield1, afield2 from afile a 
where afield1 in 
(select afield1 
    from afile 
    group by afield1 
    having count(*) > 1 
); 
+2

這實際上是我首選的方式,因爲您可以返回表格的所有列。 – leek 2008-10-13 12:15:26

+0

奇怪的是,有2人投了這個答案,沒有評論爲什麼。我認爲這意味着它有什麼問題嗎? – 2008-10-14 15:28:32

+0

我猜這是慢的 – 2008-10-14 21:03:29

5

類似的問題在上週問道。那裏有一些很好的答案。

SQL to find duplicate entries (within a group)

在這個問題中,OP是在表(文件),感興趣的所有列(字段), 但排在同一組屬於,如果他們有相同的密鑰值(afield1)。

有三種答案:

子查詢的WHERE子句中,像一些其他的答案在這裏。

內連接表,並看作是一個表(我回答)組

和分析查詢之間的(東西是新的我)。

5

順便說一句,如果有人想刪除重複的,我已經使用這個:

delete from MyTable where MyTableID in (
    select max(MyTableID) 
    from MyTable 
    group by Thing1, Thing2, Thing3 
    having count(*) > 1 
) 
3

這應該是相當快的(如果連快dupeFields被索引)。

SELECT DISTINCT a.id, a.dupeField1, a.dupeField2 
FROM TableX a 
JOIN TableX b 
ON a.dupeField1 = b.dupeField2 
AND a.dupeField2 = b.dupeField2 
AND a.id != b.id 

我想唯一的缺點查詢是因爲你沒有做一個COUNT(*),你可以不檢查次數它被複制,只知道它出現不止一次。