例如表 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  每次都出现,这是为什么?
按理说, 他应该不出现的,这是怎么回事,怎么解决?

解决方案 »

  1.   

    select * from (select * from apw_ad order by createtime desc) where rownum<6 ;
      

  2.   


    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标出正确序号(有小到大);