web-dev-qa-db-fra.com

Script SQL "Get Duplicates" le plus rapide

Quel est un exemple d'un 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:

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

Mais c'est assez lent.

43
Johan Bresler

C'est le moyen le plus direct:

select afield1,count(afield1) from atable 
group by afield1 having count(afield1) > 1
78
Vinko Vrsalovic

Tu pourrais essayer:

select afield1, afield2 from afile a
where afield1 in
( select afield1
  from afile
  group by afield1
  having count(*) > 1
);
16
Tony Andrews

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

SQL pour trouver les entrées en double (au sein d'un groupe)

Dans cette question, l'OP était intéressé par toutes les colonnes (champs) de la table (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 certaines des autres réponses ici.

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

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

5
Walter Mitty

Au fait, si quelqu'un veut supprimer les doublons, j'ai utilisé ceci:

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

Cela devrait être raisonnablement 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 de COUNT(*) vous ne pouvez pas vérifier le nombre de fois il est dupliqué, seulement qu'il apparaît plus plus d'une fois.

4
Simon East