【问题标题】:delete duplicate records from sql从sql中删除重复记录
【发布时间】:2012-08-21 19:55:15
【问题描述】:

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

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

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

【问题讨论】:

标签: sql sql-server


【解决方案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

SQL Fddle with Demo

【讨论】:

  • @bluefeet 我一直认为 CTE 是临时表,这似乎是错误的,所以我很惊讶从 CTE 中删除,从源中删除。
【解决方案2】:

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

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 约束以避免进一步重复;首先,在新表上重新创建所有旧索引。

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

【讨论】:

    猜你喜欢
    • 2016-01-07
    • 2020-07-16
    • 2021-02-13
    • 2010-10-24
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多