Удалить несколько повторяющихся строк в таблице - PullRequest
5 голосов
/ 12 октября 2010

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

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

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

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

Ответы [ 4 ]

7 голосов
/ 12 октября 2010

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

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

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
2 голосов

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

Я повторно использовал определение и данные #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'
1 голос
/ 16 октября 2010

Вы также можете использовать функцию 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
0 голосов
/ 12 октября 2010
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

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

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