hpjianhua 发表于 2013-1-29 14:36:29

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 uwhere 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;

请试一下这几种用法,查看下结果是如何的呢?
页: [1]
查看完整版本: Oracle数据库下 distinct 与row_number() over的用法