Следният пример използва T-SQL за изтриване на дублиращи се редове в SQL Server.
За да бъдем по-конкретни, той изтрива дублиращи се редове, но запазва един. Така че, ако имате два еднакви реда, той изтрива единия от тях и запазва другия. С други думи, това премахва измамата на масата.
Примерни данни
Да предположим, че имаме таблица със следните данни:
SELECT * FROM Pets;
Резултат:
+---------+-----------+-----------+ | PetId | PetName | PetType | |---------+-----------+-----------| | 1 | Wag | Dog | | 1 | Wag | Dog | | 2 | Scratch | Cat | | 3 | Tweet | Bird | | 4 | Bark | Dog | | 4 | Bark | Dog | | 4 | Bark | Dog | +---------+-----------+-----------+
Можем да видим, че първите два реда са дублирани, както и последните три реда.
Изберете дубликати
Преди да премахнем дублирането на таблицата, можем да използваме следната заявка, за да видим кой ред/и ще бъдат изтрити:
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;
Резултат:
+---------+-----------+-----------+--------------+ | PetId | PetName | PetType | Row_Number | |---------+-----------+-----------+--------------| | 1 | Wag | Dog | 2 | | 4 | Bark | Dog | 2 | | 4 | Bark | Dog | 3 | +---------+-----------+-----------+--------------+
Изтриване на дубликати
За да изтрием дублиращи се стойности, можем да променим горната заявка, като заменим SELECT *
на последния ред с 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;
Резултат:
(3 rows affected)
Таблицата вече е премахната.
Можем да проверим това, като изберем отново всички редове:
SELECT * FROM Pets;
Резултат:
+---------+-----------+-----------+ | PetId | PetName | PetType | |---------+-----------+-----------| | 1 | Wag | Dog | | 2 | Scratch | Cat | | 3 | Tweet | Bird | | 4 | Bark | Dog | +---------+-----------+-----------+
Както се очакваше, един от дублиращите се редове за нашето куче „Wag” е изтрит, а другият остава. Два от дублиращите се редове за „Кора“ също бяха изтрити. Таблицата е успешно премахната.