如何删除表中重复记录


1 引言
在对数据库进行操作过程中我们可能会遇到这种情况,表中的数据可能重复出现,使我们对数据库的操作过程中带来读诸多不便,那么怎么删除这些重复没有用的数据呢?
平时工作中可能会遇到当试图对库表中的某一列或几列创建唯一索引时,系统提示 ORA-01452 :不能创建唯一索引,发现重复记录。

2 处理过程
重复的数据可能有这样两种情况:第一种是表中只有某些字段一样,第二种是两行记录完全一样。删除重复记录后的结果也分为2种,第一种是重复的记录全部删除,第二种是重复的记录中只保留最新的一条记录,一般业务中第二种的情况较多。

2.1 删除重复记录的方法原理
(1)在Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了每条记录是在Oracle中的哪一个数据文件、块、行上。
(2)在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中那些具有最大rowid的就可以了,其余全部删除。

2.2 删除部分字段重复数据
2.2.1 重复记录全部删除

DELETE FROM 表名 a WHERE  (字段1, 字段2) 
IN (SELECT 字段1,字段2 FROM 表名 GROUP  BY 字段1,字段2 HAVING COUNT(1) > 1);
---上面的语句非常简单,就是将查询到的数据删除掉。不过这种删除执行的效率非常低,对于大数据量来说,可能会将数据库吊死。所以建议先将查询到的重复的数据插入到一个临时表中,然后进行删除,
这样,执行删除的时候就不用再进行一次查询了。如下:
CREATE TABLE 临时表 AS (select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1); 上面这句话就是建立了临时表,并将查询到的数据插入其中。下面就可以进行这样的删除操作了: delete from 表名 a where 字段1,字段2 in (select 字段1,字段2 from 临时表);

2.2.2  保留最新的一条记录

假如想保留重复数据中最新的一条记录啊!那怎么办呢?在oracle中,有个隐藏了自动rowid,里面给每条记录一个唯一的rowid,我们如果想保留最新的一条记录,我们就可以利用这个字段,保留重复数据中rowid
最大的一条记录就可以了。 一、 如何查找重复记录?
SELECT * FROM bcm.table1 A WHERE ROWID NOT IN (SELECT MAX(ROWID) FROM bcm.table1 D WHERE A.id= D.id and ...);
select distinct * from 表名;
select name,Count(name) from user group by name having Count(name) >1
二、 如何删除重复记录?
删除相同的数据,保留最大的id或者最小的id min(id)
delete from user where id not in(select max(id) from user group by name) ---这种方法最简单!!!
---临时表
由此,我们要删除重复数据,只保留最新的一条数据,就可以这样写了:
create table t_rows_tmp as select D.EMPNO,D.ENAME,D.JOB,D.MGR,D.DEPTNO,MAX(a.ROWID) dataid from T_ROWS a GROUP BY D.EMPNO,D.ENAME,D.JOB,D.MGR,D.DEPTNO;
DELETE FROM T_ROWS a where a.rowid NOT IN (SELECT b.dataid FROM t_rows_tmp b WHERE a.EMPNO = b.EMPNO and a.DEPTNO = b.DEPTNO);
commit;

举例:

select count(*) from test2020;
create table test2020_bak as   select * from test2020;
select count(*) from test2020_bak;

select count(*)  from test2020 a where rowid !=(select max(rowid) from test2020 b where a.OBJECT_ID=b.OBJECT_ID );   ---使用rowid查询重复数据记录数
delete  from test2020 a where rowid !=(select max(rowid) from test2020 b where a.object_id=b.object_id)      ---删除重复数据
alter table test2020 add constraint pk_obj_id primary key (object_id);

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM