Oracle 通过rownum实现分页

php中文网
发布: 2016-06-07 17:01:02
原创
1132人浏览过

//rownum是一个伪列,是oracle系统自动为查询返回结果的每行分配的编号,第一行为1,第二行为2,以此类推。。。。 //一个oracl

//rownum是一个伪列,是oracle系统自动为查询返回结果的每行分配的编号,第一行为1,第二行为2,以此类推。。。。  
//一个oracle分页,至少要包含三层(除非不用order by,暂时可以用2层实现),模板为  
select temp2.* from(  
       select rownum num,temp1.* from(  
              sql query  
       ) temp1 where rownum)temp2 where temp2.num>n2  
-  
//例如:值返回查询结果第11条到20条着10条的信息的sql如下:  
select temp2.*  
from(  
    select rownum num,temp1.*  
      from(  
        select tt.title_id,tt.name  
              from t_title tt  
        where tt.name like '%美%' 
        order by tt.sort_seqs asc,tt.title_id desc) temp1  
    where rownum)temp2   
where temp2.num>10  
//分析:  
//1.首先是一个正常的查询语句(包含order by)  
select tt.title_id,tt.name  
from t_title tt  
where tt.name like '%美%' 
order by tt.sort_seqs asc,tt.title_id desc  
//这个和正常的sql语句没有任何的区别  
--  
//2.添加rownum字段,显示列数(注意:rownum一定是先n2)  
select rownum num,temp1.*  
from(  
    select tt.title_id,tt.name  
    from t_title tt  
    where tt.name like '%美%' 
    order by tt.sort_seqs asc,tt.title_id desc) temp1  
where rownum//我们添加了rownum 显示字段,这时候就会会每行添加一个行数的编号;并且只返回20条之前的数据(包含20条)  
--  
//3.截取第10条到20条的数据,sql就是上面最完整的那个啦。  
//使用精解:  
//1.rownum的使用:  
//如下两条语句:  
select rownum,id,name from student where rownum>2;  
select rownum,id,name from student where rownum--  
//第一条语句的执行结果为空,第二条语句的执行结果为前10条记录;  
//为什么会这样呢,我们知道rownum是伪列,是oracle为查询结果自动添加的伪列,第一行是1,  
//如果where rownum>2,这时候查找第一条发现它的rownum=1,不满足条件,于是抛弃掉,  
//把第二条语句的rownum赋值为1,再判断第二条记录是否满足条件,同样不满足。。。。  
//于是发生了死循环一样的判断,最终返回空;  
//有人这时候就奇怪啦,为什么第一条记录rownum=1不满足条件时候,第二条记录rownum=2,却要重新设值为1呢?  
//非常简单,你直接在where后添加了条件rownum>2,它是个条件啦,  
//第一条记录不满足条件,叫抛弃掉啦,这时候结果集是空的,当然会一直rownum=1的赋值;  
//解决办法:先查询,并为每条记录分配rownum,然后嵌套查询  
select t.* from (select rownum num,id,name from student) t where t.num>2  
//第二条语句可以正常的执行,根据上面的解释,这个可以理解了吧!  
--  
//2.rownum与order by同时存在的问题  
//当 where 后面有rownum的判断,并且存在order by时候,rownum的优先级高!  
//oracle会先执行rownum的判断,然后从结果中order by,很明显是错误的结果啦!  
//就好像学校要取成绩最好的前10名同学,结果这种方法一执行,成了取出10名同学,然后按照成绩的高低排序!  
//这点与sql server的top完全不同,top遇上order by,是先执行order by,在分页的;  
//解决办法就是先执行order by,然后嵌套执行rownum  
//说白啦就是用()改变函数的优先级! 

linux

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号