微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

没有标识列时如何删除重复记录SQL?

如何解决没有标识列时如何删除重复记录SQL?

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

enter image description here

解决方法

您可以使用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

window函数可确保不会在一个分区中两次分配相同的编号-您需要枚举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;
,

您可以使用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;
,

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。