如何删除 SQL 服务器中完全相同的重复行
How to delete duplicate rows that are exactly the same in SQL Server
我出于测试目的从 .CSV
文件将一些数据加载到 SQL 服务器 table,我没有任何主键、唯一键或自动生成的 ID在那 table.
下面是这种情况的一个例子:
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
您如何定义 "duplicate"?根据您的代码示例,它似乎是由 name
.
对于删除,您可以使用可更新的 CTE row_number()
:
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
子句。
我出于测试目的从 .CSV
文件将一些数据加载到 SQL 服务器 table,我没有任何主键、唯一键或自动生成的 ID在那 table.
下面是这种情况的一个例子:
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
您如何定义 "duplicate"?根据您的代码示例,它似乎是由 name
.
对于删除,您可以使用可更新的 CTE row_number()
:
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
子句。