Oracle ---rownum

我用的是scott下默认的表测试
1.select rownum r, ename from emp
where r < 10;
这里为什么用 r<10就出错,而rownum<10 却是正确的, r不是rownum的别名吗?

2.select ename from 
   (select rownum , ename from emp) 
   where rownum > 10;

select ename from 
   (select rownum r , ename from emp) 
   where r > 10; 这两个语句有什么区别第一个语句是错的为什么啊?

3.为什么 rownum只能直接和<,<=l连用,其他符号都要和子查询连用才行?

4.
我来帮他解答
 
 
 
 
 
2011-8-23 22:58
满意回答
1.select rownum r, ename from emp where r < 10;
改成
select * from (select rownum r, ename from emp ) where r < 10;
或者
select rownum,ename from emp where rownum<10;
rownum 本身就是伪劣,不存在的,只有你在select 以后才会分配
2.
rownum 只能使用 >=1 or>1 因为rownum 每次分配都是从1开始分配的,所有你使用>10,是会报错的
你要查询一个 10-20的范围的时候
select * from (select rownum r, ename from emp ) where r  between 10 and 20
追问
1.select rownum r, ename from emp
where r < 10;
2.select rownum r, ename from emp
where rownum < 10;
这两句话只是一个用r,一个用rownum筛选,为什么用r就不行
 
 
第一句中两个rownum其实不是一回事了. where条件里面的rownum是为 (select p.*,rownum from prod.product_offer p) 这个语句产生的结果集产生的伪列. 
而rownum=后面除非是1 ,是大于1的数都不会产生任何结果集. 
(举个例子,假设判断rownum=2,先判断第一列rownum分配1,结果不符合条件,接着第二条,还是rownum给分配1,还是不符合条件,所以这样下去所有的记录都是不符合条件的). 一般的用法是rownum< 一个数值第二句中两个id指的是同一回事,所以能查出来.
记住rownum是伪列,不是实际存在的列就可以了.
 
其实,就是执行顺序的问题,在select rownum r, ename from emp where r < 10;中先执行where 语句,接着才执行select语句中的别名即 rownum r ,所以是错的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值