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.