遇到一个不懂得sql,求大神指点

牧码Yin 发布于 2017/06/26 10:22
阅读 112
收藏 0

在Oracle中运行SELECT name FROM( SELECT A.*, rownum r FROM ( SELECT * FROM t_cms_content ) A WHERE rownum <10 ) B WHERE r >5;是可以查出数据的,但是运行SELECT name FROM( SELECT A.*, rownum r FROM ( SELECT * FROM t_cms_content ) A WHERE rownum >5 ) B WHERE r <10;就查不出数据,这是为什么?

加载中
0
kse-music
kse-music

可能都知道ROWNUM只适用于小于或小于等于,如果进行等于判断,那么只能等于1,不能进行大于的比较。
ROWNUM是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推。
ROWNUM总是从1开始,不管当前的记录是否满足查询结果,ROWNUM返回的值都是1,如果这条记录的值最终满足所有的条件,那么ROWNUM会递加,下一条记录的ROWNUM会返回2,否则下一条记录的ROWNUM仍然返回1。
理解了这一点,就清楚为什么一般的ROWNUM大于某个值或等于某个不为1的值是无法返回结果的,因此对于每条记录的ROWNUM都是1,而ROWNUM为1不满足查询的结果,所以下一条记录的ROWNUM不会递增,仍然是1,因此所有的记录都不满足条件。其实分页还可以这么写,从外层控制:

SELECT * FROM   

(  

SELECT A.*, ROWNUM RN   

FROM (SELECT * FROM TABLE_NAME) A   

)  

WHERE RN BETWEEN 5 AND 10

牧码Yin
牧码Yin
谢谢,我对sql了解的太少了,多谢指点
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部