Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Elimina le righe duplicate in SQL Server

L'esempio seguente usa T-SQL per eliminare le righe duplicate in SQL Server.

Per essere più specifici, elimina le righe duplicate ma ne conserva una. Quindi, se hai due righe identiche, ne cancella una e conserva l'altra. In altre parole, deduplica il tavolo.

Dati di esempio

Supponiamo di avere una tabella con i seguenti dati:

SELECT * FROM Pets;

Risultato:

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

Possiamo vedere che le prime due righe sono duplicate, così come le ultime tre righe.

Seleziona Duplicati

Prima di deduplicare la tabella, possiamo utilizzare la seguente query per vedere quale/i riga/e verranno eliminate:

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;

Risultato:

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

Elimina i duplicati

Per eliminare i valori duplicati, possiamo modificare la query precedente sostituendo SELECT * sull'ultima riga con 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;

Risultato:

(3 rows affected)

Il tavolo è stato ora deduplicato.

Possiamo verificarlo selezionando nuovamente tutte le righe:

SELECT * FROM Pets;

Risultato:

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

Come previsto, una delle righe duplicate per il nostro cane "Wag" è stata eliminata e l'altra rimane. Anche due delle righe duplicate per "Bark" sono state eliminate. La tabella è stata deduplicata con successo.