您的位置:首页 > 数据库 > Oracle

Oracle的分页查询

2017-12-25 00:00 274 查看
因为Oracle不像MySQL一样有limit函数来实现分页查找,oracle要实现分页查询可使用关键字rownum来处理。使用rownum有以下几点需要注意:

1、ROWNUM存在使用规则,在单个子查询中,对于WHERE中的ROWNUM限制只能使用<或者<=;

2、ROWNUM用于从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,而且rownum不能以任何表的名称作为前缀;

下面通过rownum的三种方式来实现oracle的多表分页查询(单表也一样):

1、通过子查询的方式

select *
from (select row_.*, rownum rownum_
from (select u.login_name,u.name,d.name as name1,s.name as name2,s.url
from site_admin ad left join user u on ad.user_id = u.id
left join site s on ad.site_id = s.id
left join department d on u.dept_id = d.id) row_
where rownum <= 10)
where rownum_ > 0;

这里有一个点需要注意:当多表关联中有涉及到两张表都有同一个名称的字段是,如:



那么,需要将其他的同名称的字段取一个别名用来区分,否则查询会报错:ambiguous fields...

2、minus关键字-多次查询

select u.login_name,u.name,u.sex,u.mobile,u.phone,u.email,d.name,s.name,s.url
from site_admin ad left join user u on ad.user_id = u.id
left join site s on ad.site_id = s.id
left join department d on u.dept_id = d.id where rownum <=10
minus
select u.login_name,u.name,d.name,s.name,s.url
from site_admin ad left join user u on ad.user_id = u.id
left join site s on ad.site_id = s.id
left join department d on u.dept_id = d.id where rownum <=5;

上面的sql中,查的是6~10的记录,就把前10条记录减去前5条记录,但是这个看起来太啰嗦也很冗长,不太建议。

3、between...and...以及排序

select *
from (select row_.*, rownum rownum_
from (select u.login_name,u.name,d.name as name1,s.name as name2,s.url
from site_admin ad left join user u on ad.user_id = u.id
left join site s on ad.site_id = s.id
left join department d on u.dept_id = d.id
order by u.name asc) row_) b
where b.rownum_ between 0 and 10;

通过子查询并且用between...and...方法也可以完成分页查询的操作,并且,有子查询,我们可以对查询结果进行排序,因为生成的rownum在order by操作的前面,为了保证排序结果一致,需要先执行order by操作,这样查询之后的排序结果会一致,第三种方法可以说是第一种方法的优化。

欢迎加入java交流群:280097991。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息