Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当没有标识列时,如何删除重复记录(SQL)?_Sql_Sql Server_Duplicates_Sql Delete_Window Functions - Fatal编程技术网

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

当没有标识列时,如何删除重复记录(SQL)?,sql,sql-server,duplicates,sql-delete,window-functions,Sql,Sql Server,Duplicates,Sql Delete,Window Functions,这是一个数据仓库项目,我在其中加载一个表,其中每列引用另一个表。问题是,由于过程中的错误,加载了许多重复记录(约13000条),但它们没有唯一标识符,因此它们完全相同。有没有办法只删除其中一条重复记录,这样我就不必删除所有内容并重复表加载过程 您可以使用行编号()和cte: with cte as ( select row_number() over( partition by col1, col2, ... order by (select null)

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


您可以使用
行编号()
和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
窗口函数保证同一个数字在一个分区内不会被分配两次-您需要通过子句枚举
分区中的所有列

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

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

您可以使用
行编号()
和可更新的CTE:

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

用于定义重复的列。

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