两张表中的查询记录主要看 有 rownum
SQL> select rownum rn,empno, ename, salary 
  2       from emp_yuchao;        RN      EMPNO ENAME                    SALARY
---------- ---------- -------------------- ----------
         1       1002 刘苍松                     8000
         2       1003 李翊                       9000
         3       1004 郭芙蓉                     5000
         4       1005 张三丰                    15000
         5       1006 燕小六                     5000
         6       1007 陆无双                     3000
         7       1008 黄蓉                       5000
         8       1009 韦小宝                     4000
         9       1010 郭靖                       4500
        10       1001 张无忌                    10000已选择10行。SQL> select rownum rn, id, name, age, password
  2       from bbs_user;        RN         ID NAME              AGE PASSWORD
---------- ---------- ---------- ---------- ----------
         1          1 a                   1 a
         2          2 b                   2 b
         3          3 c                   3 c
         4          4 d                   4 d
         5          5 5                   5 5
         6        100 100                99 100
         7         50 50                 50 50
         8          8 8                   8 8
         9          6 6                   6 6
        10         18 18                 18 18
        11         10 10                 10 10已选择11行。
----------------------
下面是两张表根据 id 排序, 加入 rownum 的结果。。
效果就不一样了, 第一张表是先排序再加 rownum, 第二张表咋是先加 rownum 再排序呢。
SQL> select rn, empno, ename, salary
  2  from(select rownum rn,empno, ename, salary 
  3       from emp_yuchao
  4       order by empno);        RN      EMPNO ENAME                    SALARY
---------- ---------- -------------------- ----------
        10       1001 张无忌                    10000
         1       1002 刘苍松                     8000
         2       1003 李翊                       9000
         3       1004 郭芙蓉                     5000
         4       1005 张三丰                    15000
         5       1006 燕小六                     5000
         6       1007 陆无双                     3000
         7       1008 黄蓉                       5000
         8       1009 韦小宝                     4000
         9       1010 郭靖                       4500已选择10行。SQL> select rn, id, name 
  2  from(select rownum rn, id, name, age, password
  3       from bbs_user
  4       order by id);        RN         ID NAME
---------- ---------- ----------
         1          1 a
         2          2 b
         3          3 c
         4          4 d
         5          5 5
         6          6 6
         7          8 8
         8         10 10
         9         18 18
        10         50 50
        11        100 100已选择11行。

解决方案 »

  1.   

    --oracle11.2
    --os xp
    create table test7( a number,b number);
    insert into test7 values(1,1);insert into test7 values(2,2);insert into test7 values(3,3);select rownum,a ,b from test7 order by a;
    /*
    1 1 1
    2 2 2
    3 3 3
    */update test7 set a=3 where b=1;
    update test7 set a=1 where b=3;select rownum,a ,b from test7 order by a;
    /*
    3 1 3
    2 2 2
    1 3 1
    */
    --总结: 主要原因 rownum与数据在数据块中存储的位置有关系。
      

  2.   

    你感觉哪条结果有问题呢?rownum只是一个虚拟列,并不是一成不变的你把你的rn改为rownum则是1..11了
      

  3.   

    这样说你可能就清楚了,rownum先于排序,也就是在排序前rownum是已经生成的,理解这个,应该就可以解决你的问题 了
      

  4.   

    楼主表奇怪,这个是你排序的字段搞的鬼!
    oracle中,rownum本身是给排序好的数据加上一个序列号的伪列,但是我们查询的时候,oracle的优化器总是会在其中搞怪!!!
    楼主第二个得到了希望的数据,看下表结构,order by 的id是不是主键索引列??
    而第一个sql没有得到想要的数据,那么大概是一个普通列吧??
    oracle优化器如果发现没有索引时,就会使用全表扫描,而全表扫表后,才会进行排序,而这个时候rownum这个伪列早已经有值了,索引才会出现那样的数据!
    因为我们可以把rownum放到子查询的外面,这个就不会出现第一种情况了~
    例:select rownum rn,...from (select ...)其实oracle早就给我们提供了更好的解决办法,那就是rownum()函数
      

  5.   

    rownum的优先级别高于ORDER BY,放在一起的话,相当于ORDER BY失效先ORDER BY完再ROWNUM
      

  6.   

            RN      EMPNO ENAME                    SALARY
    ---------- ---------- -------------------- ----------
            10       1001 张无忌                    10000
             1       1002 刘苍松                     8000
             2       1003 李翊                       9000
    第一条数据为什么不出现在最后一行。
      

  7.   

    第一条数据并不是一定要出现在第一条或者最后一条,这个是oracle优化器的选择,你如果想控制,就要在外层加查询控制
      

  8.   

    你是按empno排序,当然不在最后一列了,除非你改为descorder by empno desc--或是select rn, empno, ename, salary
     from (select rownum rn,empno, ename, salary 
         from emp_yuchao
           order by empno) t
    order by rn;
      

  9.   

    看下你的两表结构,id, empno列上是否有索引。楼主提问标题是在误导人啊。。“rowid 在两张表上查询效果为什么不同啊。。”,你的实际问题是rownum不同而不是rowid,2者是不同的概念。
      

  10.   

    rownum的优先级别高于ORDER BY,第二个查询不按id排序,结果就不一样了