oracle重复数据保留需要的一条数据

文章讲述了在数据库存在重复数据的情况下,如何通过设置删除标识来保留每组数据中的一个最小ROWNUM项。首先,通过HAVINGCOUNT(字段)>1找出重复数据,然后不直接删除,而是更新其他ROWNUM非最小的数据为删除标识。在操作中注意了ROWNUM与ROWID的区别,并提供了一段复杂的SQL更新语句来实现这一过程。
由于功能开发进度的问题,人员录入的时候仅能够多次录入,不能够录入之后直接以该数据未蓝本引入导致多部门的时候必须多次创建冗余的数据,且由于数据录入的不规范,录入了许多相同的数据,特别是同单位同部门的数据,故需要处理此类数据,因此需要对此类重复的数据设置删除标识,此组数据仅保留一项(可直接拉倒最底下看参看链接,自己实现)

思路
  1. 使用having count(字段)>1 获取到重复字段,然后反过来查出所有涉及到数据

  1. 由于前面已经对重复数据设置了唯一新增标识,其余的重复数据设置了引用标识,此时考虑到使用这个标识进行排序,然后得到每一组的最小一项ROWNUM,若直接进行删除重复项会导致唯一新增标识被错误的去掉了(回想一下可以先对此种数据先进行处理再设置唯一新增标识😅

  1. 得到最小项的ROWNUM,然后对非此ROWNNUM的数据设置删除标识

  1. 代码实现

注意点:将伪列ROWNUM 给定一个别名 原先尝试使用not in 发现无法实现 所以只能一层层包下去
update  表1  set   字段5 = '3' where 字段4 in (
select 字段4 from (
select ROWNUM a ,x.字段4 from (
select  字段4 from 表1 t  
where  EXISTS(
select  字段1,字段2  from (
select  字段1,字段2 from  表1  where  字段5 = '0'
GROUP BY 字段1 ,字段2,字段3 HAVING count(字段2)>1 
ORDER BY 字段1
)
where  t.字段1 = 字段1 and t.字段2 = 字段2
)
ORDER BY 字段1,字段3,字段2,字段6
) x 
) b
where  
 a not  in  (
select MIN(ROWNUM) a from (
select  字段1,字段2,字段3 from 表1 t  
where  EXISTS(
select  字段1,字段2  from (
select  字段1,字段2 from  表1  where  字段5 = '0'
GROUP BY 字段1 ,字段2,字段3 HAVING count(字段2)>1  
ORDER BY 字段1
)
where  t.字段1 = 字段1 and t.字段2 = 字段2
)
ORDER BY 字段1,字段3,字段2,字段6
) x 
GROUP BY 字段1,字段2,字段3
)
);

  1. 不使用ROWID ROWID 与ROWNUNM都是伪列的意思但是代表的意义不同,ROWID代表的是物理地,ROWNUNM是查询出来的逻辑编号

下图是对同一张表的排序不同查询的ROWID


参考:https://www.cnblogs.com/zfox2017/p/7676237.html

https://zhidao.baidu.com/question/1054390124419451539.html

https://blog.csdn.net/liuyongheng1991/article/details/106985963

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值