Supprimer les lignes dupliquées d’une table SQL Server à l’aide d’un script

Cet article fournit un script que vous pouvez utiliser pour supprimer les lignes dupliquées d’une table dans Microsoft SQL Server.

Version du produit d’origine : SQL Server
Numéro de l’article d’origine dans la base de connaissances : 70956

Résumé

Il existe deux méthodes courantes que vous pouvez utiliser pour supprimer les enregistrements en double d’une table SQL Server. À des fins de démonstration, commencez par créer l’exemple de table et les données ci-dessous :

CREATE TABLE original_table (key_value int )

INSERT INTO original_table values (1)
INSERT INTO original_table values (1)
INSERT INTO original_table values (1)

INSERT INTO original_table values (2)
INSERT INTO original_table values (2)
INSERT INTO original_table values (2)
INSERT INTO original_table values (2)

Ensuite, essayez les méthodes suivantes pour supprimer les lignes dupliquées de la table.

Méthode 1

Exécutez le script suivant :

SELECT DISTINCT *
INTO duplicate_table
FROM original_table
GROUP BY key_value
HAVING COUNT(key_value) > 1

DELETE original_table
WHERE key_value
IN (SELECT key_value
FROM duplicate_table)

INSERT original_table
SELECT *
FROM duplicate_table

DROP TABLE duplicate_table

Ce script effectue, dans l’ordre, les opérations suivantes :

  • Déplacement d’une instance d’une ligne dupliquée dans la table d’origine vers une table en double.
  • Suppression de toutes les lignes de la table d’origine qui se trouvent également dans la table en double.
  • Redéplacement des lignes de la table dupliquée vers la table d’origine.
  • Suppression de la table en double.

Cette méthode est simple. Toutefois, vous devez disposer d’un espace disponible suffisant dans la base de données pour générer temporairement la table en double. Cette méthode entraîne également une surcharge, car vous déplacez les données.

En outre, si votre table contient une colonne IDENTITY, vous devez utiliser SET IDENTITY_INSERT ON quand vous restaurez les données dans la table d’origine.

Méthode 2

La fonction ROW_NUMBER qui a été introduite dans Microsoft SQL Server 2005 simplifie grandement cette opération :

DELETE T
FROM
(
SELECT *
, DupRank = ROW_NUMBER() OVER (
              PARTITION BY key_value
              ORDER BY (SELECT NULL)
            )
FROM original_table
) AS T
WHERE DupRank > 1 

Ce script effectue, dans l’ordre, les opérations suivantes :

  • Utilisation de la fonction ROW_NUMBER pour partitionner les données en fonction de key_value, qui peut correspondre à une ou plusieurs colonnes séparées par des virgules.
  • Suppression de tous les enregistrements qui ont reçu une valeur DupRank supérieure à 1. Cette valeur indique que les enregistrements sont des doublons.

En raison de l’expression (SELECT NULL) , le script ne trie pas les données partitionnée en fonction d’une condition quelconque. Si votre logique de suppression des doublons nécessite de choisir les enregistrements à supprimer et ceux à conserver en fonction de l’ordre de tri des autres colonnes, vous pouvez utiliser l’expression ORDER BY pour cela.

Plus d’informations

La méthode 2 est simple et efficace pour les raisons suivantes :

  • Il n’est pas nécessaire de copier temporairement les enregistrements en double dans une autre table.
  • Il n’est pas nécessaire de joindre la table d’origine avec elle-même (par exemple, en utilisant une sous-requête qui retourne tous les enregistrements en double à l’aide d’une combinaison de GROUP BY et HAVING).
  • Pour de meilleures performances, vous devez disposer d’un index correspondant sur la table qui utilise comme key_value clé d’index et inclut toutes les colonnes de tri que vous avez peut-être utilisées dans l’expression ORDER BY .

Toutefois, cette méthode ne fonctionne pas dans les versions obsolètes de SQL Server qui ne prennent pas en charge la fonction ROW_NUMBER. Dans ce cas, vous devez utiliser la méthode 1 ou une méthode similaire à la place.