ORACLE删除表中重复数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORACLE删除表中重复数据相关的知识,希望对你有一定的参考价值。

原因

在对数据库进行操作过程中我们可能会遇到这种情况,表中的数据可能重复出现,使我们对数据库的操作过程中带来读诸多不便,那么怎么删除这些重复没有用的数据呢?

平时工作中可能会遇到当试图对库表中的某一列或几列创建唯一索引时,系统提示 ORA-01452 :不能创建唯一索引,发现重复记录。

处理方法

重复的数据可能有这样两种情况:

第一种:删除表中所有重复的数据

第二种:只保留重复数据中最新记录的一条记录【工作中常用】

 

删除重复数据的想法

每一行数据所对应的rowid都是独一无二的,及时表中两个数据完全相同,rowid也是不同的。我们只需要找出重复值的ROWID就可以删除重复值

 

 

模拟数据  

[email protected]>Create table test as select * from emp;

[email protected]>insert into test select * from test;

-

[email protected]>insert into test select * from test;

28672 rows created.

Elapsed: 00:00:00.03

 

删除重复值的所有数据

【方法一】

[email protected]>@?/rdbms/admin/utlexpt1.sql

产生exceptions表

向test表中加入(主键或是唯一约束)无法成功并把重复值rowid插入exceptions表中

[email protected]>alter table test add constraint test_empno_pk primary key(empno)

             exceptions into exceptions;

[email protected]>select count(*) from exceptions;

  COUNT(*)

----------

     28672

删除全部重复数据

[email protected]>delete from test where rowid in (select row_id from exceptions);

28672 rows deleted.

Elapsed: 00:00:00.28

 

【方法二】

[email protected]>delete from test where ename in

( select ename from test group by ename having count(*)>2);

28672 rows deleted.

Elapsed: 00:00:00.34

【方法三】

方法三是建立在方法二的基础上,由于测试数据比较少,我们无法考虑到数据库大量数据的情况,大量删除数据有可能造成会将数据库吊死,所以我们可以将重复值插入到临时表中,然后再对表进行删除

[email protected]>create table test_temp1

as (select empno,ename from test group by empno,ename having count(*)>2)

 

[email protected]>delete from test where (empno,ename) in (select empno,ename from test_temp1);

28672 rows deleted.

Elapsed: 00:00:00.26

 

 

删除重复数据保留最新一条

也是利用rowid来对数据进行处理

[email protected]>delete from test where rowid not in (select max(rowid) from test group by ename);

28658 rows deleted.

Elapsed: 00:00:00.24

 

 

创建一个临时表,向表中插入保留的rowid,

[email protected]>create table temp1(row_id urowid);

[email protected]>insert into temp1 select max(rowid) from test group by ename;

[email protected]>delete from test where rowid not in (select row_id from temp1);

28658 rows deleted.

Elapsed: 00:00:00.25

 

技术是分享,即是提升,也是创新,

文章如有错误,或者不同见解可以联系JAYEWU

微信1048586878 QQ:1048586878

 

以上是关于ORACLE删除表中重复数据的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中如何删除重复数据

如何确定Oracle数据库表中重复的记录

oracle删除重复的行怎么删啊

oracle删除重复的行怎么删啊

Oracle如何删除表中重复记录

oracle 查找删除重复数据