已emp表为基础,复制创建一张表,用于试验:
select * from emp;create table emp_copy as select * from emp;
insert into emp_copy select * from emp;
insert into emp_copy select * from emp;
很明显,emp_copy中比原来emp中每条记录重复了三次。那么如何删除这三条记录呢?
原理:要根据所有字段来分组再升序排序,然后求得每个组的排序序号不为1的rowid,再然后关联原表通过rowid删除这些记录即可:
delete from emp_copy
where rowid in (select newid
from (select rowid as newid,
a.empno,
a.ename,
a.job,
a.mgr,
a.hiredate,
a.sal,
a.comm,
a.deptno,
row_number() over(partition by a.empno, a.ename, a.job, a.mgr, a.hiredate, a.sal, a.comm, a.deptno order by rowid) as rid
from emp_copy a)
where rid <> 1);
需要注意的时候,在分组的字段中,不能出现非常规的类型列(如大字段lob类型)。