ProgrammationAnalyste SQL/BI

Comment réaliser la recherche et le traitement des doublons dans de grandes tables SQL pour garantir l'unicité des données clés ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

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 :

  • Utilisation de GROUP BY, HAVING pour trouver des doublons
  • Automatisation de la suppression via NOT IN/EXISTS/ROW_NUMBER()
  • Introduction de contraintes d'unicité pour les champs clés

Questions pièges.

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.

Erreurs typiques et anti-patterns

  • Suppression directe par une seule colonne sans tenir compte des NULL ou des clés complexes
  • Absence de suivi permanent et de journalisation des doublons
  • Mise en place de contraintes d'unicité sans nettoyage préalable de la table — cela entraînera une erreur de création d'index

Exemple réel

Cas négatif

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 :

  • Mise en œuvre rapide (avant l'index)

Inconvénients :

  • Perte de données, échecs des services, pannes de support

Cas positif

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 :

  • Données clés propres
  • Minimisation des erreurs dans l'analyse

Inconvénients :

  • Nécessite des réglages de suivi et d'automatisation des procédures