我不是职业搞数据库的,我做的事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 是起的别名,然后就可以>=了。就是这么神奇的东西,呵呵
------解决方案--------------------