我一直在研究从表中删除重复项并保留一个副本的线程。我看到了一个例子,其中有一个带有复合键的表。有人知道吗?
具有复合键校验码,薪水月,薪水年的表控制
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);
我希望删除一个副本并维护一个。
答案 0 :(得分:1)
另一种假定您提到的三列重复的方法是
特别是如果您以这种方式处理大量数据,将比删除要快得多。
如果您正在处理的dup数据是主表的子集,则步骤将为
第一步的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
);