为什么80%的码农都做不了架构师?>>>
因为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。
转载于:https://my.oschina.net/varus/blog/1594737