oracle 重复数据的排查和删除

经常因为忘记设置主键或者unique约束导致了本不能重复的表中出现了很多重复的记录,有的是部分字段内容相同导致的重复,有的是主键(本该设置主键但没设置的字段)相同导致的重复,有的是整条记录导致的重复。



如果是整条记录重复,那么去除重复是很简单的:

create table  temp_a1 as (select distinct *  from a )   --先将去掉重复的记录存放到临时表。

delete  from   a   --再删掉原表的所有记录;

insert  into   a (select *  from   temp_a1  )   --再将去掉重复后的记录转移到原表。


对于部分字段值相同导致的重复,如何查出重复的记录: 



select *  from 

( select  count(*) cnt ,t.a1,t.a2
 from a t  group by  t.a1, t.a2
 )  where  cnt !=1


说明:内部子查询用于查询出原表a中字段a1,a2的值完全相同的记录,然后分组统计个数。

外查询是在该统计结果中筛选出个数不等于1(也就是有重复的记录)的信息,

根据这些信息就可以大概知道哪些记录重复了。




具体操作:

create  table  b as

select  count(*) cnt ,t.a1,t.a2, Max(a.rowid)  dataid
 from a t  group by  t.a1, t.a2;

--将原表中字段a1,a2未重复的记录的rowid记录下来,对于重复的记录其中较大的rowid。

这样得到的rowid就是未重复的记录的所有的rowid了。


delete     from    a where  a.rowid!=(select   b.dataid    from b where a.a1=b.a1 and  a.a2=b.a2)



将原表中a1,a2字段值重复的记录直接删掉。




这样就达到了去掉部分字段值重复的记录的目的了。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

walkingmanc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值