例子:查询4-6的员工信息按照薪水降序排列
oracle分页是三层子查询嵌套,可以根据以下步骤来分析(从内到外):
1.第一层:根据查询条件查询出结果
sql语句:
SELECT emp.* FROM emp ORDER BY sal desc
2.第二层:将第一层的sql语句的结果作为第二层表中的数据,加上RowNUM伪列条件
sql语句:
SELECT temp.* ,ROWNUM rn FROM (
SELECT emp.* FROM emp ORDER BY sal desc
) temp
WHERE ROWNUM<=6
为什么where条件是ROWNUM,而不是rn????
因为sql语句是从from开始执行---到where条件,最后是select
select相当于声明了ROWNUM rn,执行where时,找不到rn
使用ROWNUM时,Rownum只能对=1和<N进行筛选,如果>M不能筛选,如何规避。
通过子查询构建临时表,让伪列Rownun称为临时表中的列,然后限定条件使用伪列的
别名。
3.第三层:(个人理解:第三层的条件是分页开始的页数,就是从第几条开始 pageIndex)
将以上两个语句嵌套在第三层中,加上where条件,此时的rn别名是可以用的,>也是可以用的
SQL语句:
SELECT * FROM(
SELECT temp.* ,ROWNUM rn FROM (
SELECT emp.* FROM emp ORDER BY sal desc
)temp
WHERE ROWNUM<=6
)
WHERE rn>=4
分页就好了。。。。。。
程序中分页的sql:
select * from (
select t.*, rownum rn from (
select * from T_BASE_PROVINCE order by id asc
) t
where rownum <= page*size
)
where rn > (page-1)*size;