sql - 删除表中多个重复行

标签 sql sql-server tsql

我在一个表中有多组重复项(一个表有 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 个(这就是我现在所需要的)。

最佳答案

如果表中有一个键列,那么您可以使用它来唯一标识表中的“不同”行。

只需使用子查询来识别唯一行的 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;

或者,您可以使用 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

关于sql - 删除表中多个重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3917565/

相关文章:

php - 显示我还没有投票的用户 - MySQL

mysql - 分组依据以查找 SQL 中特定索引的平均差异

sql - 将 mssql openjson 数组类型值结果转换为表?

sql - 是否可以将此 Sql 语句重构为不使用 RANK/PARTITION?

mysql - 如何运行包含 load data infile 语句的 sql 文件

sql - 我可以将这 2 个简单查询合并为一个查询吗?

sql - 关键字 'UPDATE' 附近的语法不正确

sql-server - 是否有任何实用程序可以从 SQL Server 中提取二进制数据?

c# - 基于分配的权限功能的授权

tsql - 可以使用OUTPUT子句在单个语句中进行UPDATE和SELECT,并且CTE包含JOIN?