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

时间:2023-03-09 14:46:51
Oracle三层嵌套分页查询示例及rownum原理

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不改变,所有的行都被抛弃,所以没有结果。