在oracle中如果rownum与order by同在,是先rownum,然后再order by 如 select * from 表明 where rownum<10 order by 字段
这样会先取rownum小于10的记录,然后再对这10条进行排序但是,有文章说如果对排序字段建立了所以,则上面的语句就能产生先排序,再rownum的效果。但是经过我测试,好像建立索引不行,数据条数的物理存储顺序并没有改变,只有建立主键后,才能实现上述的结果。有没有其他解决方法能先排序在rownum ,嵌套的方法不算,如下这样的
select * from (select * from 表明 order by 字段) where rownum < 10

解决方案 »

  1.   

    这现象并不是与索引或主键有关...
    oracle 执行计划如果从条件开始执行的话一定是先顺序取出num条记录再做排序的..
      

  2.   

    1."在oracle中如果rownum与order by同在,是先rownum,然后再order by" ,这个论述是对的.2.可以借助于oracle 的row_number 分析函数来实现zl 的需求.
    SQL> select * from test a;        ID NAME
    ---------- ----------
             1 lasdjfla
             3 lasdje23
             3 kk
             3 bbb
             2 lasdje23
             2 aaa6 rows selectedSQL> select a.* from  test a where rownum <6;        ID NAME
    ---------- ----------
             1 lasdjfla
             3 lasdje23
             3 kk
             3 bbb
             2 lasdje23SQL> select a.* ,row_number() over ( order by id )  rn from  test a where rownum <6;        ID NAME               RN
    ---------- ---------- ----------
             1 lasdjfla            1
             2 lasdje23            2
             3 lasdje23            3
             3 kk                  4
             3 bbb                 5
    SQL> 
      

  3.   

    kongkongye(飘流瓶)  说的方法不行select a.* ,row_number() over ( order by id )  rn from  test a where rownum <6
     
    select * from test where rownum<6 order by id这两条的结果是一样的,和嵌套或按主键来排序的结果是不同的。
      

  4.   

    讨论rownum和order by是没有意义的
    rownum是一个伪列,和数据的组织方式相关,它不能唯一标识记录如果你没有定义主键或能唯一标识记录的字段的话,唯一标识记录的是rowid,插入一条记录后就为有个唯一的rowid来标识,且rowid不会再改变。但是如果你的表改变了表空间的话,rowid也可能会改变
      

  5.   

    sorry,是我理解偏了.个人认为,既然嵌套写法已经能实现了,似乎没有办法不用嵌套就能够实现,那么继续讨论这个问题似乎没有多大必要的.
      

  6.   

    a:
    select a.* ,row_number() over ( order by id )  rn from  test a where rownum <6
     
    b:
    select * from test where rownum<6 order by id语句a和语句b绝对是不一样的语句a的rownum和语句b的rownum是不同的
    a的rownum是排序后生成的
    b的rownum是排序前生成的这是SQL语句执行顺序的基本常识claspcn(扣子)会得出一样的结论可能是因为用id来排序的结果
    如果id这个字段本身是主键,或者在添加的时候就是按照升序输入值的,那么这个order by id用不用都会查询到一样的结果
      

  7.   

    完全没必要使用嵌套的,使用row_number就可以,rownum 和row_number区别简单些就是,rownum<n是从表里按物理存储位置读取n条后再进行各样的处理,而row_number是先处理(如排序)后再读取N条  ,这也就可以理解rownum为什么不能和>号一起用的疑问.
      

  8.   

    嘿嘿,近段时间收集了rownum的相关资料,可以一起学习一下http://blog.csdn.net/mantisXF/archive/2007/07/10/1684805.aspx
      

  9.   

    1 rownum :  rownum 来自order by 
      必须从1开始,且一直递增
      且查询时只能从1开始查询(即rownum = 1 或者 rownum < N )
      rownum = 2 是不会查询到数据的,
    2 row_number() : 来自 over (  partition by ** order by ****)
      必须从1开始,但是是组内递增,换组再从1开始
      查询时需要嵌套,外层方可访问row_number
      

  10.   

    补充一下:
    Select  row_number() over ( partition by temp1.TEMP_B order by temp1.TEMP_B )  aS RR, temp1.TEMP_A, temp1.TEMP_KEY     from temp1 
     ORDER BY temp1.TEMP_KEY DESC order by temp1.TEMP_B  是用来产生ROW_NUMBER的,不参与最终排序
    但是如果 ORDER BY temp1.TEMP_KEY DESC 这句没有,那么最终排序就是 order by temp1.TEMP_B
      

  11.   

    不好意思,题目都没看明白,就乱说了
    1 rownum :  rownum 来自原数据库顺序,如楼主和各位大大所说,先取ROWNUM,再排序 
    用 row_number() 一样需要嵌套,不嵌套好像不行
      

  12.   

    除了嵌套外,可以这样实现;首先建一视图,在视图中做排序然后在查询中使用下列语句
    select * from tablename_v where rownum < 10
      

  13.   

    再次向大家道歉
    可怜的我,下次一定不乱说了
    说错了不要紧,误导了别人就不好了
    csdn上贴子不能修改看见上面的几句话联就发烫
    重新说一下:
    1 rownum :  rownum 来自数据库原始顺序
      必须从1开始,且一直递增
      且查询时只能从1开始查询(即rownum = 1 或者 rownum < N )
      rownum = 2 是不会查询到数据的,
    2 row_number() : 来自 over (  partition by ** order by ****)
      必须从1开始,但是是组内递增,换组再从1开始
      查询时需要嵌套,外层方可访问row_number3 SELECT
        row_number() 
          over (partition by temp1.TEMP_B order by temp1.TEMP_B) AS RR, 
        temp1.TEMP_A
      FROM 
        temp1 
      ORDER BY 
        temp1.TEMP_KEY DESC 最终排序是 order by temp1.TEMP_KEY
    order by temp1.TEMP_B  是用来产生ROW_NUMBER的,不参与最终排序
    但是如果 ORDER BY temp1.TEMP_KEY DESC 这句没有,那么最终排序就是 order by temp1.TEMP_B应该没有错了
      

  14.   


      1 rownum :  rownum 来自order by 
      必须从1开始,且一直递增
      且查询时只能从1开始查询(即rownum = 1 或者 rownum < N )
      rownum = 2 是不会查询到数据的,
    2 row_number() : 来自 over (  partition by ** order by ****)
      必须从1开始,但是是组内递增,换组再从1开始
      查询时需要嵌套,外层方可访问row_number
    //--------------------------------------------
      支持这个.
      

  15.   

    To henry1451() ( ) 信誉:100 : 可别,“rownum 来自order by “
     这一句是错的, rownum 来自原始DB顺序
     并非来自order by