Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Löschen Sie doppelte Zeilen in SQL Server

Im folgenden Beispiel wird T-SQL verwendet, um doppelte Zeilen in SQL Server zu löschen.

Genauer gesagt, es löscht doppelte Zeilen, behält aber eine. Wenn Sie also zwei identische Zeilen haben, wird eine davon gelöscht und die andere beibehalten. Mit anderen Worten, es dedupliziert die Tabelle.

Beispieldaten

Angenommen, wir haben eine Tabelle mit den folgenden Daten:

SELECT * FROM Pets;

Ergebnis:

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

Wir können sehen, dass die ersten beiden Zeilen Duplikate sind, ebenso wie die letzten drei Zeilen.

Duplikate auswählen

Bevor wir die Tabelle deduplizieren, können wir die folgende Abfrage verwenden, um zu sehen, welche Zeile/n gelöscht werden:

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;

Ergebnis:

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

Duplikate löschen

Um doppelte Werte zu löschen, können wir die obige Abfrage ändern, indem wir SELECT * ersetzen in der letzten Zeile mit 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;

Ergebnis:

(3 rows affected)

Die Tabelle wurde nun dedupliziert.

Wir können dies überprüfen, indem wir erneut alle Zeilen auswählen:

SELECT * FROM Pets;

Ergebnis:

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

Wie erwartet wurde eine der doppelten Zeilen für unseren Hund „Wag“ gelöscht und die andere bleibt bestehen. Zwei der doppelten Zeilen für „Bark“ wurden ebenfalls gelöscht. Die Tabelle wurde erfolgreich dedupliziert.