Comment supprimer des doublons dans une base SQL ?

0
2777

Les doublons dans une base de données prennent de la place inutilement et peuvent causer des erreurs sur un site web ou une application. Dans un précédent article des requêtes SQL pour trouver les doublons étaient présentées. Cet article-ci présente une requête pour supprimer les doublons tout en conservant une ligne.

ATTENTION : avant de commencer à exécuter la requête de suppression, il faut penser à faire un backup (cf. une sauvegarde) de la table concernée. Dans le pire des cas, il sera possible de la ré-installer.

Supprimer les doublons d'une table

Supprimer les doublons d’une table

Rappel : requête pour trouver les doublons

Avant de vouloir supprimer les éventuels doublons, il faut commencer par vérifier s’il y en a. La requête suivante est à utiliser en remplaçant les champs 1 à 3 par les champs de votre choix qui doivent servir de référentiel pour trouver les lignes dupliquées.

SELECT   COUNT(*) AS nbr_doublon, champ1, champ2, champ3
FROM     table
GROUP BY champ1, champ2, champ3
HAVING   COUNT(*) > 1

Attention, selon le type de lignes dupliquées, il ne faut peut-être pas faire de recherche en utilisant les champs qui servent de timestamp (exemple : un champ DATETIME).

Requête pour supprimer les doublons

Si la requête précédente à bien retournée des résultats considéré comme des doublons, alors il est temps de passer à l’étape suivante pour préparer la suppression. La requête ci-dessous sert à supprimer les lignes en trop qui possèdent les même données dans les colonnes “champ1” à “champ3” (à personnaliser).

DELETE FROM table
LEFT OUTER JOIN (
        SELECT MIN(id) as id, champ1, champ2, champ3
        FROM table
        GROUP BY champ1, champ2, champ3
    ) as t1 
    ON table.id = t1.id
WHERE t1.id IS NULL

Attention, il y a plusieurs choses à savoir à propos de cette requête :

  • Le champ “id” est à personnaliser selon le nom de la colonne de votre propre table.
  • La requête va conserver la ligne avec l’ID le plus petit car la fonction MIN() est utilisée. Il est possible de conserver la requête avec l’ID le plus grand en utilisant à la place la fonction MAX().
  • Cette requête assume qu’aucun champ n’est NULL.

Solution n°2

DELETE t1 
FROM table AS t1, table AS t2
WHERE t1.id > t2.id
AND t1.column1 = t2.column1
AND t1.column2 = t2.column2
AND t1.column3 = t2.column3

Vérifier

Il faut songer à vérifier que tout s’est bien passé après avoir supprimé toutes ces lignes. Il est possible de contrôler qu’il n’y a plus de doublons. S’il y en a toujours, c’est le moment de recommencer en corrigeant la requête. Si au contraire trop de lignes ont été supprimées, il faut ré-installer la sauvegarde pour ne pas perdre inutilement des lignes.

A noter : il existe d’autres manières de supprimer les doublons. N’hésitez pas à utiliser une autre technique si vous n’êtes pas à l’aise avec celle-ci.

LEAVE A REPLY

Please enter your comment!
Please enter your name here