Oracle数据库下 distinct 与row_number() over的用法

一.先介绍下Oracle去重关键字distinct的用法:

1.distinct对单表去重是比较简单的,如:

select distinct r.user_id r.name from ap_user_role r;


这个是对单个用户只出一条记录的用法。 



2.对多个表的联合查询去重使用distinct方法,请看下面的方法,判断是否有问题?

(1).案例一:

 select distinct r.user_id ,r.name , u.id,u.sex from ap_user_role r, ap_user u where

 u.id=r.user_id;


用法正确吗?

(2).案例二:

 select distinct t.user_id from (
 
 select r.user_id,r.name, u.id,u.sex from ap_user_role r, ap_user u
 
 where u.id=r.user_id
 
 ) t


这两种用法那种正确呢?

二.再来介绍下Oracle函数ROW_NUMBER() OVER的用法:

语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)

简单的说row_number()从一开始,为每一条分组记录返回一个数字,这里的ROW_NUMBER()

OVER (ORDER BY create_time DESC) 是先把create_time列降序,再为降序以后的每条

create_time记录返回一个序号。

如何使用呢?请看以下案例:

select t.* from (

select u.id, u.name, r.user_id,r.name, row_number() over(partition by u.id order 

by u.create_time desc) as num 

from ap_user u, ap_user_role r where u.id=r.user_id

) t where t.num=1;


请试一下这几种用法,查看下结果是如何的呢?


猜你喜欢

转载自hpjianhua.iteye.com/blog/1731596