Давайте назовем их столбцами id и Col1.
DELETE myTable T1
WHERE EXISTS
(SELECT * FROM myTable T2
WHERE T2.id = T1.id AND T2.Col1 > T1.Col1)
Редактировать: Как отмечает Андомар, вышеизложенное не избавляет от точных повторяющихся случаев, когда и id, и Col1 одинаковы в разных строках.
Они могут быть обработаны следующим образом:
(примечание: при этом приведенный выше запрос универсальный SQL , к MSSQL 2005 и выше применяется следующее)
Он использует функцию Общее табличное выражение (CTE) вместе с функцией ROW_NUMBER () для создания отличительного значения строки. По сути, это та же конструкция, что и выше, за исключением того, что теперь она работает с «таблицей» (CTE в основном похожи на таблицу), которая имеет действительно отличный ключ идентификатора.
Обратите внимание, что, удалив «AND T2.Col1 = T1.Col1», мы создадим запрос, который может обрабатывать оба типа дубликатов (дубликаты только с идентификатором и дубликаты как Id, так и Col1) в одном запросе, то есть аналогично тому, как это делал Хамадри. решение (PARTITION в его / ее CTE служит той же цели, что и подзапрос в этом решении, по сути, выполняется тот же объем работы). В зависимости от ситуации, может быть предпочтительным, с точки зрения производительности или иным образом, обрабатывать ситуацию в два этапа.
WITH T AS
(SELECT ROW_NUMBER() OVER (ORDER BY id, Col1) AS rn, id, Col1 FROM MyTable)
DELETE T AS T1
WHERE EXISTS
(SELECT *
FROM T AS T2
WHERE T2.id = T1.id AND T2.Col1 = T1.Col1
AND T2.rn > T1.rn
)