Följande exempel använder T-SQL för att ta bort dubbletter av rader i SQL Server.
För att vara mer specifik tar den bort dubbletter av rader men behåller en. Så om du har två identiska rader, tar den bort en av dem och behåller den andra. Med andra ord, det deduperar tabellen.
Exempeldata
Anta att vi har en tabell med följande 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 att de två första raderna är dubbletter, liksom de tre sista raderna.
Välj Dubbletter
Innan vi de-duperar tabellen kan vi använda följande fråga för att se vilka rader som kommer att raderas:
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 | +---------+-----------+-----------+--------------+
Ta bort dubbletter
För att ta bort dubbletter av värden kan vi ändra ovanstående fråga genom att ersätta SELECT *
på sista raden 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 har nu avduperats.
Vi kan verifiera detta genom att markera alla rader igen:
SELECT * FROM Pets;
Resultat:
+---------+-----------+-----------+ | PetId | PetName | PetType | |---------+-----------+-----------| | 1 | Wag | Dog | | 2 | Scratch | Cat | | 3 | Tweet | Bird | | 4 | Bark | Dog | +---------+-----------+-----------+
Som väntat har en av dubblettraderna för vår hund "Wag" raderats och den andra finns kvar. Två av dubblettraderna för "Bark" har också tagits bort. Tabellen har avduperats.