欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Oracle三层嵌套分页查询示例及rownum原理

程序员文章站 2022-03-13 17:21:18
eg:COMPONENT表数据如下 1.执行select * from (select com.*,rownum r_num from (select * from COMPONENT)com where rownum < 8) where r_num > 2 2.执行 select * from ......

eg:COMPONENT表数据如下

Oracle三层嵌套分页查询示例及rownum原理

1.执行select * from (select com.*,rownum  r_num  from (select * from COMPONENT)com where rownum < 8) where r_num > 2

Oracle三层嵌套分页查询示例及rownum原理

2.执行 select * from (select com.*,rownum  r_num  from (select * from COMPONENT)com where rownum =1) where r_num < 5

Oracle三层嵌套分页查询示例及rownum原理

3. select * from (select com.*,rownum  r_num  from (select * from COMPONENT)com where rownum =2) where r_num < 5

Oracle三层嵌套分页查询示例及rownum原理

 

原因:

 rownum是oracle根据查询动态生成额,产生rownum之前不看where条件子句,所以当查询一条结果时,rownum被oracle初始化为1, 这时执行where子句,

       成立则继续,否则则丢 弃,这也就是为什么rownum=1  rownum<n好使的原因。

rownum=2不好使是因为:

1.执行查询操作

2.将第一行的row num置为1

3.将得到的行的row num与条件相比较,如果不匹配,则抛弃行,如果匹配,则返回行

4.oracle获取下一行,然后将rownum增1

5.返回第3步

同理,select rownum,id from COMPONENT where rownum>2也不返回行,因为先执行查询select id from COMPONENT,将第1行的rownum标为1,然后看where条件,1<2为false,则抛弃行,执行第2行,还是rownum标为1,看where条件还是1<2为为false,所以永远是false,rownum不改变,所有的行都被抛弃,所以没有结果。