Généralement, il est recommandé de mettre des contraintes uniques sur une table pour éviter les lignes en double. Cependant, vous pouvez vous retrouver à travailler avec une base de données dans laquelle des lignes en double ont été créées par une erreur humaine, un bogue dans votre application ou des données non nettoyées provenant de sources externes. Ce tutoriel vous apprendra comment trouver ces lignes en double.
Pour suivre, vous aurez besoin d'un accès en lecture à votre base de données et d'un outil pour interroger votre base de données.
Identifier les critères en double
La première étape consiste à définir vos critères pour une ligne en double. Avez-vous besoin d'une combinaison de deux colonnes pour être uniques ensemble, ou cherchez-vous simplement des doublons dans une seule colonne ? Dans cet exemple, nous recherchons des doublons dans deux colonnes de notre tableau Utilisateurs :nom d'utilisateur et adresse e-mail.
Écrire une requête pour vérifier l'existence de doublons
La première requête que nous allons écrire est une requête simple pour vérifier si des doublons existent bien dans la table. Pour notre exemple, ma requête ressemble à ceci :
SELECT username, email, COUNT(*)
FROM users
GROUP BY username, email
HAVING COUNT(*) > 1
HAVING
est important ici car contrairement à WHERE
, HAVING
filtres sur les fonctions d'agrégation.
Si des lignes sont renvoyées, cela signifie que nous avons des doublons. Dans cet exemple, nos résultats ressemblent à ceci :
nom d'utilisateur | compter | |
---|---|---|
Pierre | [email protected] | 2 |
Jessica | [email protected] | 2 |
Miles | [email protected] | 2 |
Répertorier toutes les lignes contenant des doublons
À l'étape précédente, notre requête a renvoyé une liste de doublons. Maintenant, nous voulons renvoyer l'intégralité de l'enregistrement pour chaque ligne en double.
Pour ce faire, nous devrons sélectionner la table entière et la joindre à nos lignes en double. Notre requête ressemble à ceci :
SELECT a.*
FROM users a
JOIN (SELECT username, email, COUNT(*)
FROM users
GROUP BY username, email
HAVING count(*) > 1 ) b
ON a.username = b.username
AND a.email = b.email
ORDER BY a.email
Si vous regardez attentivement, vous verrez que cette requête n'est pas si compliquée. Le SELECT
initial sélectionne simplement chaque colonne de la table des utilisateurs, puis la joint en interne avec la table de données dupliquée de notre requête initiale. Comme on joint la table à elle-même, il faut utiliser des alias (ici, on utilise a et b) pour étiqueter les deux versions.
Voici à quoi ressemblent nos résultats pour cette requête :
identifiant | nom d'utilisateur | |
---|---|---|
1 | Pet | [email protected] |
6 | Pet | [email protected] |
12 | Jessica | [email protected] |
13 | Jessica | [email protected] |
2 | Miles | [email protected] |
9 | Miles | [email protected] |
Étant donné que cet ensemble de résultats inclut tous les ID de ligne, nous pouvons l'utiliser pour nous aider à dédupliquer les lignes ultérieurement.