【问题标题】:How to delete duplicate records (SQL) when there is no identification column?没有标识列时如何删除重复记录(SQL)?
【发布时间】:2020-12-23 03:15:49
【问题描述】:

这是一个数据仓库项目,我在其中加载了一个表,其中每一列都引用另一个表。问题是由于过程中的错误,加载了许多重复记录(大约 13,000 条),但它们没有唯一标识符,因此它们完全相同。有没有办法只删除一条重复记录,这样我就不必删除所有内容并重复表加载过程?

【问题讨论】:

    标签: sql sql-server duplicates sql-delete window-functions


    【解决方案1】:

    您可以使用row_number() 和 cte:

    with cte as (
        select row_number() over(
            partition by col1, col2, ... 
            order by (select null)) rn
        from mytable
    )
    delete from cte where rn > 1
    

    窗口函数保证不会在一个分区内两次分配相同的数字 - 您需要在 partition by 子句中枚举所有列。

    如果您要删除大部分行,那么清空并重新创建表可能会更简单:

    create table tmptable as select distinct * from mytable;
    truncate table mytable;   -- back it up first!
    insert into mytable select * from tmptable;
    drop table tmptable;
    

    【讨论】:

      【解决方案2】:

      您可以使用 row_number 删除重复的行,方法是先对它们进行分区,然后按具有该分区的列之一进行排序。

      如果记录完全相同,您必须列出分区中的所有列。

      WITH CTE1 AS (
          SELECT A.*
              , ROW_NUMBER(PARTITION BY CODDIMALUMNO, (OTHER COLUMNS) ORDER BY CODDIMALUMNO) RN
          FROM TABLE1 A
      )
      DELETE FROM CTE1
      WHERE RN > 1;
      

      【讨论】:

        【解决方案3】:

        您可以使用row_number() 和可更新的 CTE:

        with todelete as (
              select t.*, row_number() over (partition by . . . ) as seqnum
              from t
             )
        delete from todelete
            where seqnum > 1;
        

        . . . 用于定义重复的列。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-08-06
          • 2020-03-31
          • 1970-01-01
          • 2016-01-07
          • 1970-01-01
          • 2021-11-11
          • 1970-01-01
          • 2010-10-24
          相关资源
          最近更新 更多