一尘不染

使用临时表删除重复记录

sql

请使用以下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一行之后)没有意义。在我们有用于删除所有重复行的代码集的地方,这消除了重复行,那么上一节的内容是什么?

该查询发现这里

谢谢


阅读 160

收藏
2021-03-10

共1个答案

一尘不染

在我们有用于删除所有重复行的代码集的地方,这消除了重复行,那么上一节的内容是什么?

首先,它删除曾经有重复的所有行。也就是说,所有行,并且原始也。在上述情况下,'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
2021-03-10