从sql中删除重复记录

时间:2012-08-21 11:40:54

标签: 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 )

我需要删除重复记录,如果它是第二次出现...需要保留第一个或任何一个记录。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:4)

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

请参阅SQL Fddle with Demo

答案 1 :(得分:1)

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

CREATE TABLE Import_Master_Deduped AS SELECT * FROM Import_Master WHERE FALSE;

这将创建一个与Import_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;

此时,在检查一切正常后,您可以重命名交换其名称的两个表(这将丢失任何旧索引),或者TRUNCATE Import_Master表并将重新记录的记录从新表复制回旧表。

在第二种情况下,在旧表上重新创建UNIQUE约束以避免进一步重复;在第一个中,重新创建新表上的任何旧索引。

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