首页 > 解决方案 > 删除重复项并保留一份副本

问题描述

我一直在研究有关从表中删除重复项并保留一份副本的线程。我已经看到了一个插图,说明一个表有一个带有复合键的表。有这个想法的人吗?

具有复合键 checkno、salary_month、sal_year 的表控件

delete (select * from CONTR t1
    INNER JOIN
 (select CHECKNO, SALARY_YEAR,SALARY_MONTH FROM CONTR 
group by CHECKNO, SALARY_YEAR,SALARY_MONTH HAVING COUNT(*) > 1) dupes 
ON 
t1.CHECKNO = dupes.CHECKNO AND
t1.SALARY_YEAR= dupes.SALARY_YEAR AND
t1.SALARY_MONTH=dupes.SALARY_MONTH);

我希望删除一个副本并保留一个副本。

标签: sqloraclesql-delete

解决方案


假设你有你提到的 3 列的欺骗,实现此目的的另一种方法是

  1. 创建具有不同值的临时表
  2. 放下你的桌子
  3. 重命名临时表

特别是如果您以这种方式处理大量数据,这将比删除快得多。

如果您正在处理的 dup 数据是主表的子集,则步骤将是

  1. 创建具有不同值的临时表
  2. 从主表中删除所有 dup 列
  3. 将临时表中的数据插入主表

第一步的 SQL 将是

create table tmp_CONTR AS 
select distinct CHECKNO, SALARY_YEAR,SALARY_MONTH   -- this part can be modified to match your needs 
  from CONTR t1;

推荐阅读