2008-10-13 18 views
41

Was ist ein Beispiel für ein schnelles SQL, um Dubletten in Datasets mit Hunderttausenden von Datensätzen zu erhalten? Ich verwende normalerweise etwas wie:Schnellstes SQL-Skript "Get Duplicates"

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

Aber das ist ziemlich langsam.

Antwort

74

Dies ist der direktere Weg:

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

Sie könnten versuchen:

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

Dies ist eigentlich meine bevorzugte Art, weil Sie alle Spalten der Tabelle zurückgeben können. – leek

+0

Seltsamerweise haben 2 Personen diese Antwort abgelehnt, ohne zu kommentieren, warum. Ich nehme an, das bedeutet, dass etwas nicht stimmt? –

+0

Ich denke, es ist langsamer –

5

Eine ähnliche Frage letzte Woche gefragt wurde. Da gibt es einige gute Antworten.

SQL to find duplicate entries (within a group)

In dieser Frage war die OP interessiert in allen Spalten (Felder) in der Tabelle (Datei), aber Reihen in der gleichen Gruppe gehört, wenn sie den gleichen Schlüsselwert (afield1) hatte.

Es gibt drei Arten von Antworten:

Subqueries in der Klausel, wo, wie einige der anderen Antworten hier.

eine innere Verknüpfung zwischen dem Tisch und der als Tabelle (meine Antwort) betrachtet Gruppen

und analytische Abfragen (etwas, das mir neu).

5

By the way, wenn jemand die Duplikate entfernen will, ich habe benutze:

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

Habe gerade bemerkt, dass dadurch nur eines der Duplikate entfernt wird. Wenn drei Zeilen mit demselben Wert vorhanden sind, müssen Sie diese Abfrage zweimal ausführen, um alle Duplikate zu entfernen. –

3

Dies sollte recht schnell sein (noch schneller, wenn die dupeFields indiziert werden).

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 

Ich denke, der einzige Nachteil dieser Abfrage ist, dass, weil Sie Ihnen für die einige Male überprüfen kann nicht nicht COUNT(*) tun es dupliziert, nur, dass es mehr als einmal erscheint.

+0

Das ist nicht wirklich schnell, wenn ich es auf meinem Tisch versuche. Ich habe keinen Index. –