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

Slet dublerede rækker i SQL Server

Følgende eksempel bruger T-SQL til at slette dublerede rækker i SQL Server.

For at være mere specifik sletter den duplikerede rækker, men beholder én. Så hvis du har to identiske rækker, sletter den en af ​​dem og beholder den anden. Med andre ord, det de-duperer bordet.

Eksempel på data

Antag, at vi har en tabel med følgende data:

SELECT * FROM Pets;

Resultat:

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

Vi kan se, at de første to rækker er dubletter, ligesom de sidste tre rækker.

Vælg Dubletter

Før vi de-duperer tabellen, kan vi bruge følgende forespørgsel til at se, hvilke rækker der vil blive slettet:

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;

Resultat:

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

Slet dubletter

For at slette duplikerede værdier kan vi ændre ovenstående forespørgsel ved at erstatte SELECT * på sidste linje med 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;

Resultat:

(3 rows affected)

Tabellen er nu blevet de-duperet.

Vi kan bekræfte dette ved at vælge alle rækker igen:

SELECT * FROM Pets;

Resultat:

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

Som forventet er en af ​​duplikatrækkerne for vores hund "Wag" blevet slettet, og den anden forbliver. To af dubletrækkerne for "Bark" er også blevet slettet. Tabellen er blevet de-duperet.


  1. Tilføj skiftende rækkefarve til rapporten SQL Server Reporting Services

  2. Række til kolonne transformation i MySQL

  3. Hvordan genererer man automatisk et unikt id i SQL som UID12345678?

  4. Er der en måde at definere en navngivet konstant i en PostgreSQL-forespørgsel?