日期:2014-05-17  浏览次数:20654 次

rownum的问题
例如表   apw_ad   有以下数据

列名     A1           A2       ----(A1是number)
            1             aa
            2             bb
            3             cc
            4             dd
            5             ee
            6             ff
            7             gg
我用
select   *   from   apw_ad     where   rownum <6   order   by   createtime   desc;

select   *   from   apw_ad     where   rownum <6   order   by   createtime   ;
来查询,每次出现的结果都是4条数据和   7     gg,
7     gg     每次都出现,这是为什么?
按理说,   他应该不出现的,这是怎么回事,怎么解决?


------解决方案--------------------
select * from (select * from apw_ad order by createtime desc) where rownum <6 ;
------解决方案--------------------

Oracle中的rownum的是在取数据的时候产生的序号,所以想对指定排序的数据去指定的rowmun行数据就必须注意了。
SQL> select rownum ,id,name from student order by name;
ROWNUM ID NAME
---------- ------ ---------------------------------------------------
3 200003 李三
2 200002 王二
1 200001 张一
4 200004 赵四
可以看出,rownum并不是按照name列来生成的序号。系统是按照记录插入时的顺序给记录排的号,rowid也是顺序分配的。为了解决这个问题,必须使用子查询
SQL> select rownum ,id,name from (select * from student order by name);
ROWNUM ID NAME
---------- ------ ---------------------------------------------------
1 200003 李三
2 200002 王二
3 200001 张一
4 200004 赵四
这样就成了按name排序,并且用rownum标出正确序号(有小到大);