-
幕布斯6054654
您没有说明您使用的是哪个版本,但在SQL 2005及更高版本中,您可以使用带有OVER子句的公用表表达式。它有点像这样:WITH cte AS ( SELECT[foo], [bar], row_number() OVER(PARTITION BY foo, bar ORDER BY baz) AS [rn] FROM TABLE)DELETE cte WHERE [rn] > 1玩弄它,看看你得到了什么。(编辑:为了有所帮助,有人编辑了ORDER BYCTE中的条款。要清楚,你可以按照你想要的任何顺序排序,它不一定是cte返回的列之一。事实上,一个常见的在这里使用情况是“富,酒吧”是组标识符和“巴兹”是某种形式的时间戳。为了保持最新,你会怎么做ORDER BY baz desc)
-
Helenr
示例查询:DELETE FROM TableWHERE ID NOT IN(SELECT MIN(ID)FROM TableGROUP BY Field1, Field2, Field3, ...)以下fields是您要对重复行进行分组的列。
-
呼唤远方
这是我对它的一种扭曲,有一个可运行的例子。请注意,这仅适用于唯一的情况Id,并且您在其他列中具有重复值。DECLARE @SampleData AS TABLE (Id int, Duplicate varchar(20))INSERT INTO @SampleDataSELECT 1, 'ABC' UNION ALLSELECT 2, 'ABC' UNION ALLSELECT 3, 'LMN' UNION ALLSELECT 4, 'XYZ' UNION ALLSELECT 5, 'XYZ'DELETE FROM @SampleData WHERE Id IN ( SELECT Id FROM ( SELECT Id ,ROW_NUMBER() OVER (PARTITION BY [Duplicate] ORDER BY Id) AS [ItemNumber] -- Change the partition columns to include the ones that make the row distinct FROM @SampleData ) a WHERE ItemNumber > 1 -- Keep only the first unique item)SELECT * FROM @SampleData结果如下:Id Duplicate----------- ---------1 ABC3 LMN4 XYZ不知道为什么这就是我首先想到的......绝对不是最简单的方法,但它有效。