从sql中删除重复记录

从sql中删除重复记录,sql,sql-server,Sql,Sql Server,在我的表格里有这么多重复的记录 SELECT ENROLMENT_NO_DATE, COUNT(ENROLMENT_NO_DATE) AS NumOccurrences FROM Import_Master GROUP BY ENROLMENT_NO_DATE HAVING ( COUNT(ENROLMENT_NO_DATE) > 1 ) 我需要删除重复记录,如果它是第二次发生。。。需要保留第一个或任何一个记录。我该怎么做 一种方法是创建辅助临时表 CREATE TABLE Impor

在我的表格里有这么多重复的记录

SELECT ENROLMENT_NO_DATE,  COUNT(ENROLMENT_NO_DATE) AS NumOccurrences
FROM Import_Master GROUP BY ENROLMENT_NO_DATE HAVING ( COUNT(ENROLMENT_NO_DATE) > 1 )

我需要删除重复记录,如果它是第二次发生。。。需要保留第一个或任何一个记录。我该怎么做

一种方法是创建辅助临时表

CREATE TABLE Import_Master_Deduped AS SELECT * FROM Import_Master WHERE FALSE;
这将创建一个具有相同结构的空表以导入\u Master。现在使用索引对新表施加唯一性:

CREATE UNIQUE INDEX Import_Master_Ndx ON Import_Master_Deduped(ENROLMENT_NO_DATE);
最后,使用INSERT IGNORE复制包含重复记录的表,以便不会插入重复记录:

INSERT IGNORE INTO Import_Master_Deduped SELECT * FROM Import_Master;
此时,在检查一切正常后,可以重命名两个表,交换它们的名称,这将丢失所有旧索引,或者截断Import_主表,并将重复数据消除的记录从新表复制回旧表

在第二种情况下,在旧表上重新创建唯一约束以避免进一步重复;首先,在新表上重新创建所有旧索引


最后,删除不再需要的表。

一种方法是创建辅助临时表

CREATE TABLE Import_Master_Deduped AS SELECT * FROM Import_Master WHERE FALSE;
这将创建一个具有相同结构的空表以导入\u Master。现在使用索引对新表施加唯一性:

CREATE UNIQUE INDEX Import_Master_Ndx ON Import_Master_Deduped(ENROLMENT_NO_DATE);
最后,使用INSERT IGNORE复制包含重复记录的表,以便不会插入重复记录:

INSERT IGNORE INTO Import_Master_Deduped SELECT * FROM Import_Master;
此时,在检查一切正常后,可以重命名两个表,交换它们的名称,这将丢失所有旧索引,或者截断Import_主表,并将重复数据消除的记录从新表复制回旧表

在第二种情况下,在旧表上重新创建唯一约束以避免进一步重复;首先,在新表上重新创建所有旧索引


最后,删除不再需要的表。

您可以使用CTE执行此任务:

;with cte as
(
  select ENROLMENT_NO_DATE, 
    row_number() over(partition by ENROLMENT_NO_DATE order by ENROLMENT_NO_DATE) rn
  from Import_Master
) 
delete from cte where rn > 1

请参见

您可以使用CTE执行此任务:

;with cte as
(
  select ENROLMENT_NO_DATE, 
    row_number() over(partition by ENROLMENT_NO_DATE order by ENROLMENT_NO_DATE) rn
  from Import_Master
) 
delete from cte where rn > 1

请参见表的主键是什么?@João没有人。。。但是需要注册日期作为表格中唯一的日期有很多与此主题相关的帖子。请浏览这些链接。表格的主键是什么?@João NO one。。。但是需要注册日期在表格中是唯一的。有很多帖子与这个主题相关。请浏览这些链接。@BlueFoots我一直认为CTE是临时表格,这似乎是错误的,所以我很惊讶从CTE中删除,从源代码中删除。@BlueFoots我一直认为CTE是临时表格,这似乎是错误的,所以我很惊讶从CTE中删除,从源代码中删除。