1

在我的表中,我有很多重复的记录

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

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

4

2 回答 2

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

于 2012-08-21T11:55:15.570 回答
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 约束以避免进一步重复;首先,在新表上重新创建任何旧索引。

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

于 2012-08-21T11:54:48.577 回答