Удаление нескольких повторяющихся строк в таблице

Я уверен, что это было задано раньше, но мне было трудно найти его.

У меня есть несколько групп дубликатов в одной таблице (3 записи для одного, 2 для другого и т. Д.) – несколько строк, где существует более 1.

Ниже приводится то, что я придумал, чтобы удалить их, но мне нужно запустить скрипт для любого количества дубликатов:

set rowcount 1 delete from Table where code in ( select code from Table group by code having (count(code) > 1) ) set rowcount 0 

Это хорошо работает в определенной степени. Мне нужно запустить это для каждой группы дубликатов, а затем он удаляет только 1 (что все, что мне нужно сейчас).

Я ценю вашу помощь / комментарии!

Если у вас есть ключевой столбец в таблице, вы можете использовать его для однозначной идентификации «отдельных» строк в таблице.

Просто используйте вспомогательный запрос, чтобы идентифицировать список идентификаторов для уникальных строк, а затем удалить все за пределами этого набора. Что-то вроде …..

 create table #TempTable ( ID int identity(1,1) not null primary key, SomeData varchar(100) not null ) insert into #TempTable(SomeData) values('someData1') insert into #TempTable(SomeData) values('someData1') insert into #TempTable(SomeData) values('someData2') insert into #TempTable(SomeData) values('someData2') insert into #TempTable(SomeData) values('someData2') insert into #TempTable(SomeData) values('someData3') insert into #TempTable(SomeData) values('someData4') select * from #TempTable --Records to be deleted SELECT ID FROM #TempTable WHERE ID NOT IN ( select MAX(ID) from #TempTable group by SomeData ) --Delete them DELETE FROM #TempTable WHERE ID NOT IN ( select MAX(ID) from #TempTable group by SomeData ) --Final Result Set select * from #TempTable drop table #TempTable; 

Альтернативно, вы можете использовать CTE, например:

 WITH UniqueRecords AS ( select MAX(ID) AS ID from #TempTable group by SomeData ) DELETE A FROM #TempTable A LEFT outer join UniqueRecords B on A.ID = B.ID WHERE B.ID IS NULL 

Часто бывает более эффективно копировать уникальные строки во временную таблицу,
drop source table, переименовать временную таблицу.

Я повторно использовал определение и данные #TempTable, называемые здесь как SrcTable, так как невозможно переименовать временную таблицу в обычную)

 create table SrcTable ( ID int identity(1,1) not null primary key, SomeData varchar(100) not null ) insert into SrcTable(SomeData) values('someData1') insert into SrcTable(SomeData) values('someData1') insert into SrcTable(SomeData) values('someData2') insert into SrcTable(SomeData) values('someData2') insert into SrcTable(SomeData) values('someData2') insert into SrcTable(SomeData) values('someData3') insert into SrcTable(SomeData) values('someData4') 

Джон Сэнсом в предыдущем ответе

 -- cloning "unique" part SELECT * INTO TempTable FROM SrcTable --original table WHERE id IN (SELECT MAX(id) AS ID FROM SrcTable GROUP BY SomeData); GO; DROP TABLE SrcTable GO; sys.sp_rename 'TempTable', 'SrcTable' 

Вы также можете использовать ROW_NUMBER() для фильтрации дубликатов

 ;WITH [CTE_DUPLICATES] AS ( SELECT RN = ROW_NUMBER() OVER (PARTITION BY SomeData ORDER BY SomeData) FROM #TempTable ) DELETE FROM [CTE_DUPLICATES] WHERE RN > 1 
 SET ROWCOUNT 1 DELETE Table FROM Table a WHERE (SELECT COUNT(*) FROM Table b WHERE b.Code = a.Code ) > 1 WHILE @@rowcount > 0 DELETE Table FROM Table a WHERE (SELECT COUNT(*) FROM Table b WHERE b.Code = a.Code ) > 1 SET ROWCOUNT 0 

это приведет к удалению всех повторяющихся строк, но вы можете добавлять атрибуты, если вы хотите сравнить их.

Давайте будем гением компьютера.