Вот что вы можете попробовать, если версия SQL Server 2005 или более поздняя.
WITH cte AS
(
SELECT {list-of-columns-in-table},
row_number() over (PARTITION BY {list-of-key-columns} ORDER BY {rule-to-determine-row-to-keep}) as sequence
FROM myTable
)
DELETE FROM cte
WHERE sequence > 1
При этом используется общее табличное выражение (CTE) и добавляется столбец последовательности.{list-columns-in-table} так же, как это говорится.Не все столбцы нужны, но я не буду здесь объяснять.
{список-ключей-столбцов] - это столбцы, которые вы используете для определения дубликата.
{rule-to-define-row-to-keep} - это последовательность, так что первая строка - это строка, которую нужно сохранить.Например, если вы хотите сохранить самую старую строку, вы должны использовать столбец даты для последовательности.
Вот пример запроса с реальными столбцами.
WITH cte AS
(
SELECT ID, CourseName, DateAdded,
row_number() over (PARTITION BY CourseName ORDER BY DateAdded) as sequence
FROM Courses
)
DELETE FROM cte
WHERE sequence > 1
В этом примере удаляются дубликаты.строки, основанные на значении CoursName и сохраняющие самые старые based на значении DateAdded.