.首先rownum是一个查询缓存级别的东西,所以以下写法是错误的
select rownum rn,a.* from student a where rn<=;
因为rn其实不是student表的内容,看做一个缓存编号就好
但是有些人不服了,加个a.rn<=
select rownum rn,a.* from student a where a.rn<=;结果还是不行,这下相信了吧
那么oracle的分页可以这样写吗
select * from rsk_book where rownum<= and rownum>=;奇怪了oracle的rownum没用了吗,开下脑洞,换个方向
select * from rsk_book where rownum>= and rownum<=;
结果发现还是不行,为什么呢??这是因为oracle rownum的查询默认是从1开始的,判断rownum>=,那么默认第一条不成立,就跳到第二条,结果第二条的rownum又是从1开始,以此类推条件永不成立,所以查询结果就是空的
. 那么分页究竟什么写呢,把分页的rownum存成子表
这样写吗, select * from (select rownum rn, a.* from studenta where rownum<= ) where rownum>= ;(原因看1.的永不成立的理论)
正确写法是这样的,弄个中间结果 select * from (select rownum rn, a.* from studenta where rownum<= ) where rn>= ;
我们发现只要1个子查询就能完成分页了,那网上和一些教学视频为什么会出现两个子查询呢,我想这只是见样学样,来源于脑洞的模仿
select * from (select rownum rn,a1.* from (select * from rsk_book) a1 where rownum <=) where rn>=;(3个select2个子查询),有些东西还是要动动脑子的。