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 la base de connaissances d’origine : 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 introduite dans Microsoft SQL Server 2005 simplifie considérablement 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 dekey_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 effectuer cette opération.
Plus d’informations
La méthode 2 est simple et efficace pour ces raisons :
- Il ne vous oblige pas à copier temporairement les enregistrements dupliqués dans une autre table.
- Il ne vous oblige pas à joindre la table d’origine avec elle-même (par exemple, en utilisant une sous-requête qui retourne tous les enregistrements dupliqués à l’aide d’une combinaison de et
HAVING
).GROUP BY
- Pour des performances optimales, vous devez avoir un index correspondant sur la table qui utilise la
key_value
clé d’index et inclut toutes les colonnes de tri que vous avez peut-être utilisées dans l’expressionORDER 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.