删除表中的多个重复行

Dan*_*Dan 5 sql t-sql sql-server

我确定以前曾经问过,但我很难找到它.

我在一个表中有多组重复项(3个记录为一个,2个为另一个,等等) - 存在多个行的多行.

下面是我想要删除它们,但我必须运行脚本,但有许多重复:

set rowcount 1
delete from Table
where code in (
  select code from Table 
  group by code
  having (count(code) > 1)
)
set rowcount 0
Run Code Online (Sandbox Code Playgroud)

这在某种程度上很有效.我需要为每组重复项运行它,然后它只删除1(这是我现在所需要的).

感谢您的帮助/评论!

Joh*_*som 7

如果表上有一个键列,则可以使用它来唯一标识表中的"不同"行.

只需使用子查询来标识唯一行的ID列表,然后删除此集合之外的所有内容.有些东西......

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;
Run Code Online (Sandbox Code Playgroud)

或者,你可以使用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
Run Code Online (Sandbox Code Playgroud)