首页  ·  知识 ·  数据库
rownum受不受orderby影响的观察
网友  阿福的技术BLOG  Oracle  编辑:德仔   图片来源:网络
message10867746 t_msgfont 很多书上都写:rownum伪列不受order by子句影响,今天试
很多书上都写: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的影响!
本文作者:网友 来源:网络阿福的技术BLOG
CIO之家 www.ciozj.com 微信公众号:imciow
   
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读