sql >> Database >  >> RDS >> Sqlserver

Dubbele rijen verwijderen in SQL Server

In het volgende voorbeeld wordt T-SQL gebruikt om dubbele rijen in SQL Server te verwijderen.

Om specifieker te zijn, het verwijdert dubbele rijen, maar behoudt er een. Dus als je twee identieke rijen hebt, wordt er een verwijderd en de andere behouden. Met andere woorden, het ontdubbelt de tabel.

Voorbeeldgegevens

Stel dat we een tabel hebben met de volgende gegevens:

SELECT * FROM Pets;

Resultaat:

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

We kunnen zien dat de eerste twee rijen duplicaten zijn, net als de laatste drie rijen.

Selecteer duplicaten

Voordat we de tabel ontdubbelen, kunnen we de volgende query gebruiken om te zien welke rij(en) worden verwijderd:

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;

Resultaat:

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

Duplicaten verwijderen

Om dubbele waarden te verwijderen, kunnen we de bovenstaande zoekopdracht wijzigen door SELECT * . te vervangen op de laatste regel met 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;

Resultaat:

(3 rows affected)

De tafel is nu ontdubbeld.

We kunnen dit verifiëren door alle rijen opnieuw te selecteren:

SELECT * FROM Pets;

Resultaat:

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

Zoals verwacht is een van de dubbele rijen voor onze hond "Wag" verwijderd en de andere blijft. Twee van de dubbele rijen voor "Bark" zijn ook verwijderd. De tabel is met succes ontdubbeld.


  1. Verschil tussen tekst en varchar (karakter variërend)

  2. SQLite-queryresultaten uitvoeren als een door tabs gescheiden lijst

  3. Oracle vergelijkt tijdstempel met datum

  4. Database die>500 miljoen rijen aankan