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

rownum到底是什么时候生成的
看网上有人说查询语句执行完成之前的最后一步会生成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是不是就是插入记录时的顺序呢?

------解决方案--------------------
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.
------解决方案--------------------
可以怎么说 rownum是在查询的时候就已经跟每行数据赋值了 所以在rownum和任何排序分组一起存在的时候不会看到效果 一般使用rownum的话 是查询经过排序分组后的表
------解决方案--------------------
关于ROWNUM伪列
对于每个查询返回的行,ROWNUM都会返回一个数值来表明每一行在表或连接查询结果集中的位置。
第1行ROWNUM返回1,第2行返回2,以次类推。

行被选择的顺序取决于使用的索引和连接的顺序。如果指定了ORDER BY子句,ROWNUM是在排序之前赋值。ORDER BY 子句的出现,可能会改变使用的索引和连接的顺序。如果选择的行的顺序改变了,与每行相关系的ROWNUM的值也会跟着改变。