oracle rownum 查询条件分开

ahujyy 2008-07-27 02:02:31
select * from (select rownum no,id,name from student where rownum<=3 ) where no >=2;
为什么别名的那个条件不能和rownum用and连接放在内层,把外层去掉啊
select rownum no,id,name from student where rownum<=3 and no >=2;
...全文
177 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Yanbin_Q 2008-07-28
  • 打赏
  • 举报
回复
楼主可以看我整理过一个关于 rownum 的东西

为什么Oracle的伪列rownum不支持>,>=,=,between...and,而都用<比较
Yanbin_Q 2008-07-28
  • 打赏
  • 举报
回复
rownum 是过滤之后的记录编号

select * from table1 where rownum>1 查不到记录就这么回事
比如记录是
aa
bb
cc
dd
ee

如果你觉得rownum>1 应该能查出
bb
cc
dd
ee

其实此时 bb 所对应用的 rownum才是1,所以无法确定记录
lxxzhy 2008-07-28
  • 打赏
  • 举报
回复
rownum的话,rownum一定要包含1,怎么理解呢?
在where clause中,一般是这样的形式:
where condition A
and condition B
and ...
and rownum <= x

oracle处理的机制是,把所有rownum的条件过滤掉之后,形成了一个结果集,结果集中每一行有个一虚拟的序号(就是rownum的值),但这个虚拟的序号不是固定不变的,例如:
结果集为:
id
aaa
bbb
ccc
ddd
此时: aaa对应的rownum为1, bbb对应的rownum为2,如此类推.
当你的where clause中出现:
1. rownum = 1
oracle会在这个结果集的基础上每一行去检测rownum的值,显然只有aaa符合,因此只返回aaa那一行.
2. rownum <= 3
oracle同样在结果集中每一行去检测rownum的值,显然aaa bbb ccc符合,因此返回3行.

3. rownum = 2
oracle在检测第一行时发现第一行aaa的rownum不等于2,因此把此行从结果集中去掉,然后重新生成结果集如下:
id
bbb
ccc
ddd
此时,rownum就会重新生成,也就是bbb为1,ccc为2ddd为3.
这样的话,当在检测bbb这一行的时候,发现它的rownum是1,也不符合条件(rownum = 2),所以又把这行从结果集中去掉了,如此类推,因此你得到结果是一行也select不出来.
4. rownum >= x (x 不等于1)
这种条件得出的结果也是一行也没有的,可以根据第3种情况自己推算一下.

所以,你在网上搜到很多关于rownum的资料都会说: rownum一定要包括1.
ahujyy 2008-07-28
  • 打赏
  • 举报
回复
谢谢各位的讲解.特别感谢lxxzhy.结帖了.
胡矣 2008-07-27
  • 打赏
  • 举报
回复
请问
select rownum no,id,name from student where rownum <=3 and rownum >=2
能行吗?
一个道理啊
wangydong 2008-07-27
  • 打赏
  • 举报
回复
当然不行了,select * from (select rownum no,id,name from student where rownum <=3 ) where no >=2;是高等内层查完了才查外层,而后者是并列的。

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧