很多书上都写:rownum伪列不受order by子句影响,今天试了一下,发现不是那么简单的,呵呵。
QUOTE:
SQL> create table t6 as select * from t5;
表已创建。
SQL> select constraint_name,constraint_type from user_constraints where table_na
me='T6';
未选定行
表t6现在是一个没有约束的表
QUOTE:
SQL> select rownum,rowid,t6.* from t6;
ROWNUM ROWID A B C
---------- ------------------ ---------- ---------- ----------
1 AAAHROAAKAAAALkAAA 1 2
2 AAAHROAAKAAAALkAAB 2 2
3 AAAHROAAKAAAALkAAC 3 2
4 AAAHROAAKAAAALkAAD 5 3
5 AAAHROAAKAAAALkAAE 4 3
6 AAAHROAAKAAAALkAAF 6 7
7 AAAHROAAKAAAALkAAG 8 6
已选择7行。
SQL> select rownum,rowid,t6.* from t6 order by a;
ROWNUM ROWID A B C
---------- ------------------ ---------- ---------- ----------
1 AAAHROAAKAAAALkAAA 1 2
2 AAAHROAAKAAAALkAAB 2 2
3 AAAHROAAKAAAALkAAC 3 2
5 AAAHROAAKAAAALkAAE 4 3
4 AAAHROAAKAAAALkAAD 5 3
6 AAAHROAAKAAAALkAAF 6 7
7 AAAHROAAKAAAALkAAG 8 6
已选择7行。
SQL> select rownum,rowid,t6.* from t6 order by a desc;
ROWNUM ROWID A B C
---------- ------------------ ---------- ---------- ----------
7 AAAHROAAKAAAALkAAG 8 6
6 AAAHROAAKAAAALkAAF 6 7
4 AAAHROAAKAAAALkAAD 5 3
5 AAAHROAAKAAAALkAAE 4 3
3 AAAHROAAKAAAALkAAC 3 2
2 AAAHROAAKAAAALkAAB 2 2
1 AAAHROAAKAAAALkAAA 1 2
已选择7行。
由上面可以看到,在普通字段上排序后,rownum的值与记录的rowid密切相关,它不受order by子句的影响。下面我们设置个主键再来看看
QUOTE:
SQL> alter table t6 add constraint con_p_t6 primary key (a);
表已更改。
SQL> select rownum,rowid,t6.* from t6;
ROWNUM ROWID A B C
---------- ------------------ ---------- ---------- ----------
1 AAAHROAAKAAAALkAAA 1 2
2 AAAHROAAKAAAALkAAB 2 2
3 AAAHROAAKAAAALkAAC 3 2
4 AAAHROAAKAAAALkAAD 5 3
5 AAAHROAAKAAAALkAAE 4 3
6 AAAHROAAKAAAALkAAF 6 7
7 AAAHROAAKAAAALkAAG 8 6
已选择7行。
SQL> select rownum,rowid,t6.* from t6 order by a;
ROWNUM ROWID A B C
---------- ------------------ ---------- ---------- ----------
1 AAAHROAAKAAAALkAAA 1 2
2 AAAHROAAKAAAALkAAB 2 2
3 AAAHROAAKAAAALkAAC 3 2
4 AAAHROAAKAAAALkAAE 4 3
5 AAAHROAAKAAAALkAAD 5 3
6 AAAHROAAKAAAALkAAF 6 7
7 AAAHROAAKAAAALkAAG 8 6
已选择7行。
SQL> select rownum,rowid,t6.* from t6 order by a desc;
ROWNUM ROWID A B C
---------- ------------------ ---------- ---------- ----------
1 AAAHROAAKAAAALkAAG 8 6
2 AAAHROAAKAAAALkAAF 6 7
3 AAAHROAAKAAAALkAAD 5 3
4 AAAHROAAKAAAALkAAE 4 3
5 AAAHROAAKAAAALkAAC 3 2
6 AAAHROAAKAAAALkAAB 2 2
7 AAAHROAAKAAAALkAAA 1 2
已选择7行。
嘿嘿,与rowid紧密相关的rownum变成与order by相关了!再来看看普通字段
QUOTE:
SQL> select rownum,rowid,t6.* from t6 order by b;
ROWNUM ROWID A B C
---------- ------------------ ---------- ---------- ----------
1 AAAHROAAKAAAALkAAA 1 2
2 AAAHROAAKAAAALkAAB 2 2
3 AAAHROAAKAAAALkAAC 3 2
4 AAAHROAAKAAAALkAAD 5 3
5 AAAHROAAKAAAALkAAE 4 3
7 AAAHROAAKAAAALkAAG 8 6
6 AAAHROAAKAAAALkAAF 6 7
已选择7行。
SQL> select rownum,rowid,t6.* from t6 order by b desc;
ROWNUM ROWID A B C
---------- ------------------ ---------- ---------- ----------
6 AAAHROAAKAAAALkAAF 6 7
7 AAAHROAAKAAAALkAAG 8 6
4 AAAHROAAKAAAALkAAD 5 3
5 AAAHROAAKAAAALkAAE 4 3
1 AAAHROAAKAAAALkAAA 1 2
2 AAAHROAAKAAAALkAAB 2 2
3 AAAHROAAKAAAALkAAC 3 2
已选择7行。
看来,在普通字段上排序,rownum的值还是与记录的rowid紧密相关的。
结论:rownum伪列受不受order by排序的影响,要看我们order by什么字段。如果我们order by非主键字段,那么rounum是不受order by影响的;如果我们order by主键字段,那么rownum的值将受order by的影响!