【问题标题】: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 子句。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-21
        • 2023-02-06
        • 2020-02-08
        • 2021-06-01
        • 2020-11-29
        • 2013-08-25
        相关资源
        最近更新 更多