oracle 删除重复数据你想不到的方法大全-开发系列(六)

适合初学者阅读微笑


引:

我们在做数据库开发用 pl sql 加工数据时,经常会遇到需要去除重复脏数据的情况,所以特地对此做个简单的总结,以便以后用到回顾。

重复数据分为 整条记录重复 和某个字段重复,删除目标分为重复数据全删除和重复数据删除留一条


解决:


1 distinct  删除某字段所有重复的数据


假设要去重的字段为b 表为 a 先建个临时表a_temp,把select distinct a.b 的数据放入到a_temp,然后用delete from a where b in (select b from a_temp)


2 删除 某个字段重复数据 但是留下最小rowid的那条(即还留一条 且不重复)


delete from wh_td2 a
   where a.rowid > (select min(b.rowid)
                      from wh_td2 b
                     where a.processinstid = b.processinstid)


3  group by  删除某字段所有重复的数据


delete from wh_td2 a
   where a.processinstid > (select b.processinstid
                      from wh_td2 b
                     group by  b.processinstid having count(1)>1)

4 row_number over() 删除某字段所有重复的数据


下面的语句是查询出 object_id 重复的语句,partition 分组 跟group by 分组的区别是  partition分组后 可以看到组内成员的信息,而group by 
只能看到组的总统计信息。

select t.object_id,
       row_number() over(partition by t.object_id order by t.object_id) del_flag
  from scott.dba_objects_bak t;



删除语句:
delete from scott.dba_objects_bak
   where object_id in (select object_id
                         from (select t.object_id,
                                      row_number() over(partition by t.object_id order by t.object_id) as del_flag
                                 from scott.dba_objects_bak t)where del_flag > 1 );






row_number over() 删除某字段所有重复的数据(根据条件指定留一条)


如下图:根据 partition 分组后的object_id 若有重复的话 ,根据object_name 排序, 同样的object_id 可以识别出object_name最小的那条数据,即按指定条件 去重了 到时候加上del_flag=1 条件即可



需要数据的话 把 del_flag=1 条件后的数据 放入到新建表即可。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值