两张表中的查询记录主要看 有 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行。
--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与数据在数据块中存储的位置有关系。
oracle中,rownum本身是给排序好的数据加上一个序列号的伪列,但是我们查询的时候,oracle的优化器总是会在其中搞怪!!!
楼主第二个得到了希望的数据,看下表结构,order by 的id是不是主键索引列??
而第一个sql没有得到想要的数据,那么大概是一个普通列吧??
oracle优化器如果发现没有索引时,就会使用全表扫描,而全表扫表后,才会进行排序,而这个时候rownum这个伪列早已经有值了,索引才会出现那样的数据!
因为我们可以把rownum放到子查询的外面,这个就不会出现第一种情况了~
例:select rownum rn,...from (select ...)其实oracle早就给我们提供了更好的解决办法,那就是rownum()函数
---------- ---------- -------------------- ----------
10 1001 张无忌 10000
1 1002 刘苍松 8000
2 1003 李翊 9000
第一条数据为什么不出现在最后一行。
from (select rownum rn,empno, ename, salary
from emp_yuchao
order by empno) t
order by rn;