Oracle删除表中重复数据

Oracle

删除表中重复数据

   

 

我们可能会出现这种情况,某个表原来设计不周全,导致表里面的数据数据

重复,那么,如何对重复的数据进行删除呢?

 

        

     

重复的数据可能有这样两种情况,第一种时表中只有某些字段一样,第

二种是两行记录完全一样。

 

一、对于部分字段重复数据的删除

 

        

先来谈谈如何查询重复的数据吧。

 

        

下面语句可以查询出那些数据是重复的:

 

select 

字段

1,

字段

2,count(*) 

from 

表名

 

group 

by 

字段

1,

字段

having 

count(*) > 1 

        

将上面的

>

号改为

=

号就可以查询出没有重复的数据了。

 

        

想要删除这些重复的数据,

 

可以使用下面语句进行删除

 

delete from 

表名

 

a where 

字段

1,

字段

2 in 

    

(select 

字段

1,

字段

2,count(*) 

from 

表名

 

group 

by 

字段

1,

字段

having count(*) > 1) 

        

上面的语句非常简单,就是将查询到的数据删除掉。不过这种删除执

行的效率非常低,对于大数据量来说,可能会将数据库吊死。所以我建议先将查

询到的重复的数据插入到一个临时表中,然后对进行删除,这样,执行删除的时

候就不用再进行一次查询了。如下:

 

CREATE TABLE 

临时表

 

AS 

(select 

字段

1,

字段

2,count(*) 

from 

表名

 

group 

by 

字段

1,

字段

having 

count(*) > 1) 

        

上面这句话就是建立了临时表,

 

 

并将查询到的数据插入其中。

 

        

下面就可以进行这样的删除操作了:

 

delete from 

表名

 

a where 

字段

1,

字段

2 in (select 

字段

1

字段

2 from 

时表

); 

        

这种先建临时表再进行删除的操作要比直接用一条语句进行删除要高

效得多。

 

       

这个时候,大家可能会跳出来说,什么?你叫我们执行这种语句,那

不是把所有重复的全都删除吗?而我们想保留重复数据中最新的一条记录啊!

大家不要急,下面我就讲一下如何进行这种操作。

 

       

oracle

中,有个隐藏了自动

rowid

,里面给每条记录一个唯一的

rowid

*8tHV*T&

管业专

A}x

我们如果想保留最新的一条记录,

jmK\10u=

我们就可以利用这个字段,保留重复数据中

rowid

最大的一条记录就可以

了。

 

       

下面是查询重复数据的一个例子:

 

select a.rowid,a.* from 

表名

 

 

where a.rowid != 

 

   

select max(b.rowid) from 

表名

 

 

   

where a.

字段

1 = b.

字段

1 and 

 

   

a.

字段

2 = b.

字段

 

       

下面我就来讲解一下,

1("T0JI=3

aC

上面括号中的语句是查询出重

复数据中

rowid

最大的一条记录。

 

       

而外面就是查询出除了

rowid

最大之外的其他重复的数据了。

 

       

由此,我们要删除重复数据,只保留最新的一条数据,就可以这样写

了:

 

delete from 

表名

 

 

where a.rowid != 

 

   

select max(b.rowid) from 

表名

 

 

   

where a.

字段

1 = b.

字段

1 and 

 

   

a.

字段

2 = b.

字段

 

       

随便说一下,上面语句的执行效率是很低的,可以考虑建立临时表,

讲需要判断重复的字段、

rowid

插入临时表中,然后删除的时候在进行比较。

 

create table 

临时表

 

as 

 

    

select a.

字段

1,a.

字段

2,MAX(a.ROWID) dataid from 

正式表

 

a GROUP 

BY a.

字段

1,a.

字段

2; 

delete from 

表名

 

 

where a.rowid != 

 

   

select b.dataid from 

临时表

 

 

   

where a.

字段

1 = b.

字段

1 and 

 

   

a.

字段

2 = b.

字段

 

); 

commit; 

Delete from 

where a.rowid not in 

( select distinct 

临时表

b.dataid

-新增临时表给

rowid

取的列名》

 

from 

时表

b,test 

where 

临时表

b.id = 

a.id and 

临时表

b.name = test.name 

二、对于完全重复记录的删除

 

        

对于表中两行记录完全一样的情况,可以用下面语句获取到去掉重复

数据后的记录:

 

select distinct * from 

表名

 

可以将查询的记录放到临时表中,然后再将原来的表记录删除,最后将临时

表的数据导回原来的表中。如下:

 

CREATE TABLE 

临时表

 

AS (select distinct * from 

表名

); 

drop table 

正式表

insert into 

正式表

 

(select * from 

临时表

); 

drop table 

临时表

      

如果想删除一个表的重复数据,可以先建一个临时表,将去掉重复数据

后的数据导入到临时表,然后在从

 

临时表将数据导入正式表中,如下:

 

INSERT INTO t_table_bak 

select distinct * from t_table; 

================================

=============

 

================================

=============

 

删除重复数据总的分

2

种:

 

a

。删除完全重复列的数据;

b

。删除不完全重复列的数据。

 

1

。删除完全重复列的数据;

 

这相对简单,创建一张新表

(create table as (select distinct * from 

原表

))

删除原来的表(

Drop table 

原表),把新表名字重命名。

 

2

。删除不完全重复列的数据;

 

   

这又分为重复记录保留

1

条,或不保留。

 

案例

 

新建表

test

 

create table test 

(id number, 

name varchar2(20) 

); 

select * from test; 

 

test

表列重复的数据全部删除

 

新建临时表

test2 

create table test2 as 

(select 

name,id,count(*) 

shuliang 

from 

test 

group 

by 

name,id 

having 

count(*)>1); 

--shuliang

count(*)

的定义的列名。

 

select * from test2; 

 

删除所有重复数据

 

delete from test where (id,name) in 

)(select id,name from test2 ) 

test

表列重复的数据删除仅保留一条

 

新建临时表

test3 

create table test3 as 

(select id ,name,max(rouwid) dataid from test 

 

group by id,name ); 

select * from test3; 

 

删除

test

表重复数据,重复数据保留一条

 

delete from test where test.rowid not in 

(select 

distinct 

test3.dataid 

from 

test3,test 

where 

test3.id=test.id 

and 

test3.name=test.name ); 

 

delete from test where test.rowid not in 

(select dataid from test3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值