Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Supprimer les lignes en double dans SQL Server

L'exemple suivant utilise T-SQL pour supprimer les lignes en double dans SQL Server.

Pour être plus précis, il supprime les lignes en double mais en conserve une. Donc si vous avez deux lignes identiques, il en supprime une et conserve l'autre. En d'autres termes, il dédouble la table.

Exemple de données

Supposons que nous ayons un tableau avec les données suivantes :

SELECT * FROM Pets;

Résultat :

+---------+-----------+-----------+
| PetId   | PetName   | PetType   |
|---------+-----------+-----------|
| 1       | Wag       | Dog       |
| 1       | Wag       | Dog       |
| 2       | Scratch   | Cat       |
| 3       | Tweet     | Bird      |
| 4       | Bark      | Dog       |
| 4       | Bark      | Dog       |
| 4       | Bark      | Dog       |
+---------+-----------+-----------+

Nous pouvons voir que les deux premières lignes sont des doublons, tout comme les trois dernières lignes.

Sélectionner les doublons

Avant de dédupliquer la table, nous pouvons utiliser la requête suivante pour voir quelle(s) ligne(s) seront supprimées :

WITH CTE AS 
    (
        SELECT 
            *, 
            ROW_NUMBER() OVER ( 
                PARTITION BY PetId, PetName, PetType 
                ORDER BY PetId, PetName, PetType
                ) AS Row_Number
        FROM Pets
    )
SELECT * FROM CTE WHERE Row_Number <> 1;

Résultat :

+---------+-----------+-----------+--------------+
| PetId   | PetName   | PetType   | Row_Number   |
|---------+-----------+-----------+--------------|
| 1       | Wag       | Dog       | 2            |
| 4       | Bark      | Dog       | 2            |
| 4       | Bark      | Dog       | 3            |
+---------+-----------+-----------+--------------+

Supprimer les doublons

Pour supprimer les valeurs en double, nous pouvons modifier la requête ci-dessus en remplaçant SELECT * sur la dernière ligne avec DELETE :

WITH CTE AS 
    (
        SELECT 
            *, 
            ROW_NUMBER() OVER ( 
                PARTITION BY PetId, PetName, PetType 
                ORDER BY PetId, PetName, PetType
                ) AS Row_Number
        FROM Pets
    )
DELETE FROM CTE WHERE Row_Number <> 1;

Résultat :

(3 rows affected)

La table a maintenant été dédupliquée.

Nous pouvons le vérifier en sélectionnant à nouveau toutes les lignes :

SELECT * FROM Pets;

Résultat :

+---------+-----------+-----------+
| PetId   | PetName   | PetType   |
|---------+-----------+-----------|
| 1       | Wag       | Dog       |
| 2       | Scratch   | Cat       |
| 3       | Tweet     | Bird      |
| 4       | Bark      | Dog       |
+---------+-----------+-----------+

Comme prévu, l'une des lignes en double pour notre chien "Wag" a été supprimée et l'autre reste. Deux des lignes en double pour "Bark" ont également été supprimées. La table a été dédupliquée avec succès.