[b]一.先介绍下Oracle去重关键字distinct的用法:[/b]
1.distinct对单表去重是比较简单的,如:
这个是对单个用户只出一条记录的用法。
2.对多个表的联合查询去重使用distinct方法,请看下面的方法,判断是否有问题?
(1).案例一:
用法正确吗?
(2).案例二:
这两种用法那种正确呢?
[b]二.再来介绍下Oracle函数ROW_NUMBER() OVER的用法:[/b]
[b]语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)[/b]
简单的说row_number()从一开始,为每一条分组记录返回一个数字,这里的ROW_NUMBER()
OVER (ORDER BY create_time DESC) 是先把create_time列降序,再为降序以后的每条
create_time记录返回一个序号。
如何使用呢?请看以下案例:
请试一下这几种用法,查看下结果是如何的呢?
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
这两种用法那种正确呢?
[b]二.再来介绍下Oracle函数ROW_NUMBER() OVER的用法:[/b]
[b]语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)[/b]
简单的说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;
请试一下这几种用法,查看下结果是如何的呢?