看网上有人说查询语句执行完成之前的最后一步会生成rownum,但是order by语句得到的结果的rownum却不是按照顺序的,比如
SQL> select rownum,empno,ename from scott.emp order by sal;    ROWNUM EMPNO ENAME
---------- ----- ----------
         1  7369 SMITH
        12  7900 JAMES
        11  7876 ADAMS
         3  7521 WARD
说明rownum是在order by之前生成的,而且rownum是不是就是插入记录时的顺序呢?

解决方案 »

  1.   

    ROWNUM不是查询之后生成的。它是表中的一个伪列。数据库为了实现某些功能,为每张表都设置了类似于ROWNUM这样的伪列。那么它到底是在什么时候被赋上值的呢:
    在数据库解析完查询语句之后,并且在查询语句做任何的排序或者聚合之前,ROWNUM被赋值。
    A ROWNUM value is assigned to a row after it passes the predicate phase of the query but before the query does any sorting or aggregation. Also, a ROWNUM value is incremented only after it is assigned.
      

  2.   

    可以怎么说  rownum是在查询的时候就已经跟每行数据赋值了 所以在rownum和任何排序分组一起存在的时候不会看到效果 一般使用rownum的话 是查询经过排序分组后的表
      

  3.   

    关于ROWNUM伪列
    对于每个查询返回的行,ROWNUM都会返回一个数值来表明每一行在表或连接查询结果集中的位置。
    第1行ROWNUM返回1,第2行返回2,以次类推。行被选择的顺序取决于使用的索引和连接的顺序。如果指定了ORDER BY子句,ROWNUM是在排序之前赋值。ORDER BY 子句的出现,可能会改变使用的索引和连接的顺序。如果选择的行的顺序改变了,与每行相关系的ROWNUM的值也会跟着改变。