2008-10-13 18 views
41

Co to jest przykład szybkiego SQL, aby uzyskać duplikaty w zestawach danych z setkami tysięcy rekordów. Zazwyczaj używam czegoś takiego:Najszybszy skrypt SQL "Uzyskaj duplikaty"

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

Ale to jest dość powolne.

Odpowiedz

74

To jest bardziej bezpośredni sposób:

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

Można spróbować:

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

Jest to w rzeczywistości mój preferowany sposób, ponieważ można zwrócić wszystkie kolumny tabeli. – leek

+0

Dziwne, 2 osoby głosowały na tę odpowiedź bez komentarza. Zakładam, że to oznacza, że ​​coś jest z tym nie tak? –

+0

Domyślam się, że jest wolniejszy. –

5

Podobny pytano w ubiegłym tygodniu. Jest kilka dobrych odpowiedzi.

SQL to find duplicate entries (within a group)

W tym pytaniu OP był zainteresowany wszystkich kolumn (pól) w tabeli (pliku), ale wiersze należą do tej samej grupy, gdyby mieli taką samą wartość klucza (afield1).

Istnieją trzy rodzaje odpowiedzi:

podzapytania w klauzuli WHERE, tak jak w niektórych innych odpowiedzi tutaj.

sprzężenie wewnętrzne między stołem i grup postrzeganych jako tabeli (mojej odpowiedzi)

i zapytań analitycznych (coś, co jest dla mnie nowe).

5

Nawiasem mówiąc, jeśli ktoś chce usunąć duplikaty, użyłem to:

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

Po prostu zauważyłem, że spowoduje to tylko usunięcie jednego z duplikatów. Jeśli istnieją trzy wiersze o tej samej wartości, musisz dwukrotnie uruchomić to zapytanie, aby wyeliminować wszystkie duplikaty. –

3

ten powinien być w miarę szybko (nawet szybciej, jeśli dupeFields są indeksowane).

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 

Chyba jedynym minusem tego zapytania jest to, że ponieważ nie robisz COUNT(*) nie można sprawdzić liczbę razy to jest powielany, tylko że wydaje się więcej niż jeden raz.

+0

To nie jest naprawdę szybkie, gdy próbuję go na moim stole. Nie mam jednak indeksu. –