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

从SQL执行顺序看oracle文档对rownum的解析
首先,标准的 SQL 的解析顺序为:
 (1).FROM 子句, 组装来自不同数据源的数据
 (2).WHERE 子句, 基于指定的条件对记录进行筛选
 (3).GROUP BY 子句, 将数据划分为多个分组
 (4).使用聚合函数进行计算
 (5).使用 HAVING 子句筛选分组
 (6).计算所有的表达式
 (7).使用 ORDER BY 对结果集进行排序
 
然后,oracle联机文档对rownum的解释:“The first row selected has a ROWNUM of 1, the second has 2, and so on.”注意:只有当the first row 为真,the second 才会被has 2哦。文档给出的例子是:SELECT * FROM employees WHERE ROWNUM > 1。这里from 先执行,第一行被标志为1,然后执行where字句,发现1>1,为假;则继续第二行被标志为1,也发现为假,。。。,全部行都发现为假当然就没有数据返回咯。
 
再来看文档给出的一个例子,“SELECT * FROM (SELECT * FROM employees ORDER BY employee_id) WHERE ROWNUM < 11”。从sql执行顺序看,SELECT * FROM employees ORDER BY employee_id先解析,The first row fetched is assigned a ROWNUM of 1,发现<11,放入结果集中。。。;
 
其实,从执行顺序看rownum可以理解一切rownum的问题哦(当然啦,可能呢有点夸张呢)。譬如,度娘哪有人问了个问题:
 
selectrownum r, ename from emp where r < 10;
 
select rownum r, ename from emp where rownum< 10;
 
这两句话只是一个用r,一个用rownum筛选,为什么用r就不行?
 
现在,各看官明白了没?还是执行顺序的问题哦。如果你非要用专业眼光来看呢,是个实例化的问题呢。他这是实例化处理错了。我们来看个实例化的例子:
 
SELECT empno,ename, job, mgr, hiredate
 
FROM (SELECT empno,ename, job, mgr, hiredate, rownum rk FROM emp) t
 
WHERE rk > 2
 
到这里,归根结底,实例化的本质还是执行顺序的问题啦。反正就是执行顺序问题啦。
 
好啦。不说了。能力有限,理解有误,心里没底呀。哎。。读书人一声长叹哦。流言止于智者,帖子止于呵呵


------解决方案--------------------
rownum有这么多问题吗?
rownum不是表中已经提前定义好的列,它是在查询的过程中动态生成的数据,当然不能把对固定列的用法直接附加到这个伪列上,楼主想的有点复杂。