Následující příklad používá T-SQL k odstranění duplicitních řádků v SQL Server.
Přesněji řečeno, odstraní duplicitní řádky, ale jeden ponechá. Pokud tedy máte dva stejné řádky, jeden z nich smaže a druhý ponechá. Jinými slovy, de-duplikuje tabulku.
Ukázková data
Předpokládejme, že máme tabulku s následujícími údaji:
SELECT * FROM Pets;
Výsledek:
+---------+-----------+-----------+ | PetId | PetName | PetType | |---------+-----------+-----------| | 1 | Wag | Dog | | 1 | Wag | Dog | | 2 | Scratch | Cat | | 3 | Tweet | Bird | | 4 | Bark | Dog | | 4 | Bark | Dog | | 4 | Bark | Dog | +---------+-----------+-----------+
Vidíme, že první dva řádky jsou duplikáty, stejně jako poslední tři řádky.
Vyberte Duplikáty
Před odstraněním duplicit v tabulce můžeme použít následující dotaz, abychom zjistili, které řádky budou odstraněny:
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;
Výsledek:
+---------+-----------+-----------+--------------+ | PetId | PetName | PetType | Row_Number | |---------+-----------+-----------+--------------| | 1 | Wag | Dog | 2 | | 4 | Bark | Dog | 2 | | 4 | Bark | Dog | 3 | +---------+-----------+-----------+--------------+
Smazat duplikáty
Chcete-li odstranit duplicitní hodnoty, můžeme upravit výše uvedený dotaz nahrazením SELECT *
na posledním řádku s 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;
Výsledek:
(3 rows affected)
Tabulka byla nyní deduplikována.
Můžeme to ověřit tak, že znovu vybereme všechny řádky:
SELECT * FROM Pets;
Výsledek:
+---------+-----------+-----------+ | PetId | PetName | PetType | |---------+-----------+-----------| | 1 | Wag | Dog | | 2 | Scratch | Cat | | 3 | Tweet | Bird | | 4 | Bark | Dog | +---------+-----------+-----------+
Podle očekávání byl jeden z duplicitních řádků pro našeho psa „Wag“ smazán a druhý zůstává. Dva z duplicitních řádků pro „Kůra“ byly také odstraněny. Tabulka byla úspěšně deduplikována.