Удаление дубликатов записей с использованием временной таблицы - PullRequest
1 голос
/ 11 марта 2009

Возьмите запрос 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

Я понимаю, что он делает, но последняя часть логики (после - вставьте одну строку для каждого дублирующего набора) не имеет смысла. Где у нас есть набор кода для --delete всех строк, которые дублируются, что избавляет от дубликатов, так какова часть последнего раздела?

Этот запрос был найден здесь

Спасибо

Ответы [ 3 ]

5 голосов
/ 11 марта 2009

Где у нас есть набор кода для --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
0 голосов
/ 10 июля 2009
Create table Test (Test1 int not null , Test2 varchar(10) null )


Insert Into Test 

Select 12, 'abc'

UNion All 

Select 13 , 'def'



Insert Into Test 

Select 12, 'abc'

UNion All 

Select 13 , 'def'



Select * From Test 

WITH t1 AS 

(SELECT ROW_NUMBER ( ) OVER ( PARTITION BY test1, test2 ORDER BY test1) 

AS RNUM FROM Test )

DELETE FROM t1 WHERE RNUM > 1
0 голосов
/ 11 марта 2009

Вызов удаления удаляет все соответствующие записи.

Поскольку все дублированные строки были удалены, последний фрагмент заново вставляет одну строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...