Най-простият начин е с CTE (общ табличен израз). Използвам този метод, когато имам необработени данни за импортиране; първото нещо, което правя, за да го дезинфекцирам, е да се уверя, че няма дубликати --- че имам някакъв уникален манипулатор за всеки ред.
Резюме:
WITH numbered AS (
SELECT ROW_NUMBER() OVER(PARTITION BY [dupe-column-list] ORDER BY [dupe-column-list]) AS _dupe_num FROM [table-name] WHERE 1=1
)
DELETE FROM numbered WHERE _dupe_num > 1;
Частта "dupe-column-list" е мястото, където изброявате всички включени колони, където желаете стойностите да са уникални. ORDER BY е мястото, където вие решавате, в рамките на набор от дубликати, кой ред "печели" и кой да бъде изтрит. ("WHERE 1=1" е просто личен навик.)
Причината да работи е, че Sql Server поддържа вътрешна, уникална препратка към всеки ред източник, който е избран в CTE. Така че, когато се изпълни DELETE, той знае точния ред за изтриване, независимо какво сте поставили в списъка за избор на вашия CTE. (Ако сте нервни, можете да промените „DELETE“ на „SELECT *“, но тъй като имате дублиращи се редове, това няма да помогне; ако можехте уникално да идентифицирате всеки ред, нямаше да четете това .)
Пример:
CREATE TABLE ##_dupes (col1 int, col2 int, col3 varchar(50));
INSERT INTO ##_dupes
VALUES (1, 1, 'one,one')
, (2, 2, 'two,two')
, (3, 3, 'three,three')
, (1, 1, 'one,one')
, (1, 2, 'one,two')
, (3, 3, 'three,three')
, (1, 1, 'one,one')
, (1, 2, '1,2');
От 8-те реда имате 5 замесени с дублиращи се проблеми; 3 реда трябва да бъдат премахнати. Можете да видите проблемите с това:
SELECT col1
, col2
, col3
, COUNT(1) AS _total
FROM ##_dupes
WHERE 1=1
GROUP BY col1, col2, col3
HAVING COUNT(1) > 1
ORDER BY _total DESC;
Сега изпълнете следната заявка, за да премахнете дубликатите, оставяйки 1 ред от всеки набор от дубликати.
WITH numbered AS (
SELECT ROW_NUMBER() OVER(PARTITION BY col1, col2, col3 ORDER BY col1, col2, col3) AS _dupe_num FROM ##_dupes WHERE 1=1
)
DELETE FROM numbered WHERE _dupe_num > 1;
Сега ви остават 5 реда, нито един от които не се дублира.