Database
 sql >> Base de données >  >> RDS >> Database

Comment trouver des valeurs en double dans une table SQL

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 e-mail 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 e-mail
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.