Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9188
  • 博文数量: 3
  • 博客积分: 1425
  • 博客等级: 上尉
  • 技术积分: 40
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-05 21:24
文章分类
文章存档

2008年(3)

我的朋友
最近访客

分类: Oracle

2008-07-05 21:28:30

很多书上都写: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的影响!
阅读(1179) | 评论(2) | 转发(0) |
0

上一篇:没有了

下一篇:oracle 9.2.0.1.0版本的bug?

给主人留下些什么吧!~~

chinaunix网友2008-08-13 16:46:54

贴出执行计划看看。 FULL TABLE SCAN 应该不变。 UNIQUE INDEX SCAN 就要变。

gthboy2008-07-06 09:50:29

补充一下: 更进一步的观察可以发现,不仅仅是order by主键时可以影响到rownum,如果一个字段上有not null约束,同时存在有效索引,那么order by这个字段的时候,rownum就与rowid脱离关系,受order by的影响。因为主键是满足了not null和索引的条件,所以order by主键的时候,rownum就不一样了。