oracle数据库去重复的思路及实现

oracle的去重分为两种,完全去重和非完全去重。

完全去重

  字段完全重复,在实际工作中使用的概率并不是很大,具体解决思路:

    1.创建临时表,然后将DISTINCT查询的数据插入到临时表中;

      create table tab as(select distinct * from表名);    

    2.清空原表中的数据;

      truncate table tab01;--清除数据后创建该表

    3.将临时表中的数据插入到原表

      insert into tab01(select * from tab);--插入数据

    4.删除临时表

      drop table tab;--删除临时表

部分去重

    1.先按照要去重的字段对数据进行分组查询,判断要去重数据的数量   

select 字段1,字段2,count(*) from 表名 groupby 字段1,字段2 havingcount(*) > 1

 

    2.如果要完全删除所有重复的记录)(对重复的记录全部删除),那么可以先建一张临时表,然后再删除,要不然可能会导致数据库卡死

    

CREATE  TABLE 临时表 AS

(select 字段1,字段2,count(*) from 表名 groupby 字段1,字段2 having count(*) > 1)

  删除数据

delete from 表名 a where 字段1,字段2 in (select 字段1,字段2 from 临时表);

    3.如果是不完全删除,那么就需要借助rowid这个oracle的隐藏字段,它会给每个字段一个唯一的rowid,我们想保留最新的就要利用这个字段,具体的语句如下

create table 临时表 as

select a.字段1,a.字段2,MAX(a.ROWID) dataid from 正式表 a GROUPBY a.字段1,a.字段2;

delete from 表名 a

where a.rowid !=

(

select b.dataid from 临时表 b

where a.字段1 = b.字段1 and

a.字段2 = b.字段2

);

commit;

oracle数据库去重复的思路及实现

上一篇:分布式事务提交 - db 代理


下一篇:linux服务器初步印象,远程连接mysql数据库,传输文件,启动/关闭tomcat命令