日期:2014-05-17  浏览次数:20666 次

菜鸟求教查询:n-m行的查询
我不是职业搞数据库的,我做的事web,因为分页,自己写的sql出错,百度别人的
会用但看不懂,所以特来求教!
这是我写的sql:

select * from 
       (select * from user_info where rownum < = 8)
       where rownum>=5

结果,这一段根本不执行!

我百度了,发现这样一段代码,和我的类似:

SELECT * FROM ( SELECT A.*, ROWNUM RN 
FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21

我看不懂这条写的,为什么他的就执行了 ?

问题:
1、我的错在哪里?
2、他的代码里,SELECT A.*, ROWNUM RN 指的是什么 ?
3、为什么我百度的代码里, WHERE RN >= 21改成WHERE ROWNUM >=21报错?

----------------
菜鸟,忘提示!!!望指教!!!

------解决方案--------------------
rownum是oracle自动生成的行号,只能小于,不能大于。因为他永远从1开始,有了1才有2,有了2才有3.。。。。
------解决方案--------------------
首先知道rownum永远都是死的 只能针对当个查询 如果加个别名就不同了

你的sql里面  外层rownum只是针对了外面一层的行号 所以不可能 >= 21 必然会报错

他的sql 在内层的时候已经赋值一个别名rn 等于在外面访问rn 是内层的行号 
------解决方案--------------------
2、他的代码里,SELECT A.*, ROWNUM RN 指的是什么 ?

--先把序号查出来作为一列, 这样外层查询 就能使用 这个序号判断了,那就是真正的 行
3、为什么我百度的代码里, WHERE RN >= 21改成WHERE ROWNUM >=21报错?
--应该不会报错吧?最多是查不出数据罢了。
------解决方案--------------------
直接让rownum >= 查不出值,rownum都是从1开始的,你让他 >21 ,它找不到21就一直又从1开始了,导致查不到值。像 HJ_daxian 说的,在里面把它别名定义出来,这样在外面就可以让他 > 了,就可以用了。
------解决方案--------------------
rn  是起的别名,然后就可以>=了。就是这么神奇的东西,呵呵
------解决方案--------------------
引用:
Quote: 引用:

首先知道rownum永远都是死的 只能针对当个查询 如果加个别名就不同了

你的sql里面  外层rownum只是针对了外面一层的行号 所以不可能 >= 21 必然会报错

他的sql 在内层的时候已经赋值一个别名rn 等于在外面访问rn 是内层的行号