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.