oracle去重手段

  在数据库中,重复数据与查重是经常遇到并且需要解决的问题。在现在所做的工作中,经常会遇到需要去重的情况。今天在这里进行一下汇总。

  1.distinct

  在刚开始接触数据库时大家应该都会在书中接触到 distinct 关键字。distinct作为一个专门设计用来驱虫的关键字往往在真正的工作中不经常使用。一是因为用distinct关键字只能过滤查询字段中所有记录相同的。二是因为distinct的效率较低。用法举例:

select distinct name from t1 ;--能消除重复记录,但只能取一个字段,现在要同时取id,name这2个字段的值

select distinct id,name from t1;-- 可以取多个字段,但只能消除这2个字段值全部相同的记录

  在实际应用的很多时候,distinct的去重并不能达到我们的目的(比一个人的多条个人信息,我们可能只需要修改日期最近的一条)。这个时候就需要通过另一种手段实现:

2.group by

  删除表中重复的数据


               
  在生产环境中肯定不能随便删除的,那么使用分组嵌套也会显得很麻烦,在这里推荐我个人常用的去重方法
3.RANK() OVER() PARTITION BY
  使用这几个函数的最大优点是思路清晰。举个例子,某公司员工信息不做删除,一个员工先跳槽到其他公司,人后再跳槽回到平本公司,就可能导致不止一条员工信息。二通过身份证号码查到的员工信息应该有且仅有一条。可以这样来写sql语句:

SELECT * FROM 
(SELECT RANK() OVER(PARTITION BY 身份证号码 ORDER BY 最后更新时间 DESC) RK,t.*
 FROM emp)  T WHERE  T.RK>1
partition by后面接唯一标示,order by 后面接去重条件。通过这样写sql,可以先将查询出的结果排序,rk为自定义的排序列,将排在第一个结果取出来。
这里注意rank()函数也可以换成使用row_number(),两者的区别 ,在rk在某些情况下回出现并列的情况(去重条件没选好会有这种情况)。二使用row_number()是不会的。也就是说使用rank的排序是预许存在并列名词的情况。而使用row_number的排序不允许存在并列的情况。
  在个人在生产环境中常用第三种,比较好用思路也很清晰。在这里与大家分享一下。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值