2008-10-13 8 views
41

Qu'est-ce qu'un exemple de SQL rapide pour obtenir des doublons dans des ensembles de données avec des centaines de milliers d'enregistrements. J'utilise généralement quelque chose comme:Script SQL "Get Duplicates" le plus rapide

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

Mais c'est assez lent.

Répondre

74

Ceci est la façon plus directe:

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

Vous pouvez essayer:

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

C'est en fait ma méthode préférée, car vous pouvez retourner toutes les colonnes de la table. – leek

+0

Bizarrement, 2 personnes ont voté cette réponse sans commenter pourquoi. Je suppose que cela signifie qu'il y a quelque chose qui ne va pas? –

+0

Je suppose que c'est plus lent –

5

Une question similaire a été posée la semaine dernière. Il y a quelques bonnes réponses là-bas.

SQL to find duplicate entries (within a group)

Dans cette question, l'OP était intéressé par toutes les colonnes (champs) dans le tableau (fichier), mais les lignes appartenaient au même groupe si elles avaient la même valeur de clé (afield1).

Il existe trois types de réponses:

sous-requêtes dans la clause where, comme certains des autres réponses ici.

une jointure entre la table et les groupes considérés comme une table (ma réponse)

et les requêtes analytiques (quelque chose qui est nouveau pour moi).

5

Soit dit en passant, si quelqu'un veut supprimer les doublons, je l'ai utilisé ceci:

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

Juste remarqué que cela ne fera que supprimer l'un des doublons. S'il y avait trois lignes avec la même valeur, vous devez exécuter cette requête deux fois pour éliminer tous les doublons. –

3

Cela devrait être assez rapide (encore plus rapide si les dupeFields sont indexés).

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 

Je suppose que le seul inconvénient de cette requête est que parce que vous ne faites pas un COUNT(*) vous ne pouvez pas vérifier le nombre de fois il est dupliqué, seulement qu'il apparaît plus d'une fois.

+0

Ce n'est pas vraiment rapide quand je l'essaie sur ma table. Je n'ai pas d'indice cependant. –

Questions connexes