首先,标准的 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
 
到这里,归根结底,实例化的本质还是执行顺序的问题啦。反正就是执行顺序问题啦。
 
好啦。不说了。能力有限,理解有误,心里没底呀。哎。。读书人一声长叹哦。流言止于智者,帖子止于呵呵

解决方案 »

  1.   

    好好理解伪列 rownum 。。
      

  2.   

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

  3.   

    我整理的例子(验证过的):
    SELECT * FROM 
    (
    SELECT t.*, ROWNUM rw FROM tbl_lzy t
    ) t1
    WHERE t1.rw > 5 AND t1.rw< 10 ;1、有结果(10条):
    SELECT t.*, ROWNUM rw FROM tbl_lzy t WHERE ROWNUM > 0 AND ROWNUM < 10; 处理当前行时大于0
    2、没有结果
    SELECT t.*, ROWNUM rw FROM tbl_lzy t WHERE ROWNUM > 1 AND ROWNUM < 10; 处理当前行时不能大于1
    3.有结果: SELECT t.*, ROWNUM rw FROM tbl_lzy t WHERE ROWNUM >= 1 AND ROWNUM < 10; 处理当前行时满足等于rownumber=1总结:ROWNUMBER是在有结果的情况下处理
      

  4.   

    看了这么多还是您这句话在理,“rownum不是表中已经提前定义好的列,它是在查询的过程中动态生成的数据”分就全给您啦。