Oracle的分页查询

为什么80%的码农都做不了架构师?>>>   hot3.png

    因为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;

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

173324_Ciiu_3506479.png

那么,需要将其他的同名称的字段取一个别名用来区分,否则查询会报错: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。

 

转载于:https://my.oschina.net/varus/blog/1594737

Published by

风君子

独自遨游何稽首 揭天掀地慰生平