Le problème des doublons dans les tables est l'un des plus anciens en SQL, particulièrement renforcé par la croissance massive des services Internet et la migration de grands ensembles de données. Au début, le problème était résolu manuellement : on trouvait des doublons avec des scripts ponctuels, on les supprimait, mais avec la croissance des données, cette approche devenait inefficace.
Problème : lors de chargements maladroits, de migrations ou de pannes, il se forme souvent des dizaines de milliers de lignes avec des caractéristiques clés identiques (par exemple, email ou passeport). Cela mène à des erreurs lors des intégrations, une analyse incorrecte, une perte de confiance des clients.
Solution : construire des rapports sur les doublons à l'aide de fonctions de regroupement et de fenêtres ; réaliser la suppression des enregistrements en double en conservant un "correct" ; ajouter des contraintes (UNIQUE) pour les champs clés et un audit régulier obligatoire.
Exemple de code
WITH Duplicates AS ( SELECT email, COUNT(*) AS cnt FROM users GROUP BY email HAVING COUNT(*) > 1 ) SELECT u.* FROM users u JOIN Duplicates d ON u.email = d.email ORDER BY u.email, u.id;
Suppression des doublons (laissant la ligne avec l'id minimal) :
DELETE FROM users WHERE id NOT IN ( SELECT MIN(id) FROM users GROUP BY email );
Caractéristiques clés :
Peut-on utiliser DISTINCT pour supprimer des doublons d'une table ?
Non, DISTINCT ne fonctionne que pour les sélections (SELECT), il ne supprime pas les lignes de la table. Il faut utiliser DELETE ou INSERT ... SELECT avec DISTINCT pour créer une nouvelle table propre.
La commande DELETE ... WHERE id NOT IN (SELECT MIN(id) ...) supprime-t-elle tous les doublons de manière garantie ?
Non, si la colonne clé contient des NULL, une telle requête peut laisser des doublons par inadvertance en raison des particularités de la comparaison des valeurs NULL.
Est-il suffisant de créer un UNIQUE INDEX pour ne plus avoir de doublons ?
Non, l'index ne protègera que contre de nouvelles tentatives d'insertion de doublons, mais n'aura aucun impact sur les répétitions déjà existantes dans la table.
Le système CRM copie les utilisateurs à partir de différentes sources sans prendre en compte l'unicité des emails, dans la base de données il y a 50000 doublons. L'ajout massif d'index UNIQUE entraîne un échec, le service est à l'arrêt.
Avantages :
Inconvénients :
L'ingénieur analyse régulièrement les doublons via des rapports spécialisés, nettoie la base, crée des index uniques. Avant de migrer de nouvelles données, il effectue une validation.
Avantages :
Inconvénients :