我用的是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; 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 ,所以是错的。