Oracle分页

本文详细解析了Oracle数据库中复杂的分页查询实现方法,通过三层子查询嵌套,利用ROWNUM伪列完成按条件筛选与排序,适用于需要精确控制查询结果范围的场景。

 

例子:查询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;

 

 

转载于:https://www.cnblogs.com/luoxionghenku/p/9928667.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值