请使用以下tsql查询:
DECLARE @table TABLE(data VARCHAR(20)) INSERT INTO @table VALUES ('not duplicate row') INSERT INTO @table VALUES ('duplicate row') INSERT INTO @table VALUES ('duplicate row') INSERT INTO @table VALUES ('second duplicate row') INSERT INTO @table VALUES ('second duplicate row') SELECT data INTO #duplicates FROM @table GROUP BY data HAVING COUNT(*) > 1 -- delete all rows that are duplicated DELETE FROM @table FROM @table o INNER JOIN #duplicates d ON d.data = o.data -- insert one row for every duplicate set INSERT INTO @table(data) SELECT data FROM #duplicates
我知道它在做什么,但是逻辑的最后一部分(对于每个重复集,在– insert一行之后)没有意义。在我们有用于删除所有重复行的代码集的地方,这消除了重复行,那么上一节的内容是什么?
该查询发现这里
谢谢
在我们有用于删除所有重复行的代码集的地方,这消除了重复行,那么上一节的内容是什么?
首先,它删除曾经有重复的所有行。也就是说,所有行,并且原始也。在上述情况下,'not duplicate row'后面的表格中仅保留一行()DELETE。其他所有四行将被删除。
'not duplicate row'
DELETE
然后,再次使用删除的行填充表,但是现在删除了重复项。
这不是删除重复项的最佳方法。
最好的方法是:
WITH q AS ( SELECT data, ROW_NUMBER() OVER (PARTITION BY data ORDER BY data) AS rn FROM @table ) DELETE FROM q WHERE rn > 1