删除重复项并保留一份副本

时间:2019-05-29 16:11:10

标签: sql oracle sql-delete

我一直在研究从表中删除重复项并保留一个副本的线程。我看到了一个例子,其中有一个带有复合键的表。有人知道吗?

具有复合键校验码,薪水月,薪水年的表控制

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);

我希望删除一个副本并维护一个。

2 个答案:

答案 0 :(得分:1)

另一种假定您提到的三列重复的方法是

  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;

答案 1 :(得分:1)

您可以在下面使用此查询通过将rowid用作具有唯一值的列来删除重复项:

delete contr t1
 where rowid <
     (
      select max(rowid)
        from contr t2
       where t2.checkno = t1.checkno
         and t2.salary_year = t1.salary_year
         and t2.salary_month = t1.salary_month
      );

Demo