出于测试目的,我从.CSV
文件中将一些数据加载到SQL Server表中,该表中没有任何主键,唯一键或自动生成的ID。
Helow是这种情况的示例:
select *
from people
where name in (select name
from people
group by name
having count(name) > 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
您如何定义“重复项”?根据您的代码示例,它似乎是按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
子句。