【问题标题】:How to delete duplicate rows that are exactly the same in SQL Server [duplicate]如何删除 SQL Server 中完全相同的重复行 [重复]
【发布时间】:2020-07-27 08:15:54
【问题描述】:
出于测试目的,我从 .CSV 文件将一些数据加载到 SQL Server 表中,但该表中没有任何主键、唯一键或自动生成的 ID。
下面是一个例子:
select *
from people
where name in (select name
from people
group by name
having count(name) > 1)
当我运行这个查询时,我得到了这些结果:
目标是保留一行并删除其他重复行。
除了将内容保存在其他地方,删除所有重复行并插入新行之外,还有其他方法吗?
感谢您的帮助!
【问题讨论】:
标签:
sql
sql-server
tsql
duplicates
sql-delete
【解决方案1】:
您可以为此使用可更新的 CTE。
如果您想删除三列上完全重复的行(如您的示例数据所示并在问题中解释):
with cte as (
select row_number() over(partition by name, age, gender order by (select null)) rn
from people
)
delete from cte where rn > 1
如果您只想删除 name 上的重复项(如现有查询中所示):
with cte as (
select row_number() over(partition by name order by (select null)) rn
from people
)
delete from cte where rn > 1
【解决方案2】:
您如何定义“重复”?根据您的代码示例,它似乎来自name。
对于删除,您可以使用带有row_number() 的可更新 CTE:
with todelete as (
select p.*,
row_number() over (partition by name order by (select null)) as seqnum
from people p
)
delete from todelete
where seqnum > 1;
如果更多列定义重复,则调整partition by 子句。