应该是先取rownum<10的集合,然后在按 ORDER BY 的字段进行排序

解决方案 »

  1.   

    先取值后排序,这一点好像和sqlserver不一样
      

  2.   

    如果想先排序后取值就这样
    select * from (select * from t order by ...) where rownum<10
      

  3.   

    给个例子你看下就清楚了:
    SQL> select * from aaa_csdn_1;        ID
    ----------
          9999
          2423
           434
          5412
          6532SQL> SELECT * FROM AAA_CSDN_1 WHERE (ROWNUM < 5);        ID
    ----------
          9999
          2423
           434
          5412SQL> SELECT * FROM AAA_CSDN_1 WHERE (ROWNUM < 5) ORDER BY ID;        ID
    ----------
           434
          2423
          5412
          9999
    注意:此处没有取得 6532的记录,说明是先取记录 后 排序的得到先排序 后 取前4个
    SQL> SELECT * FROM (SELECT * FROM AAA_CSDN_1  ORDER BY ID) WHERE ROWNUM < 5;        ID
    ----------
           434
          2423
          5412
          6532
      

  4.   

    其实我一直也是这么想的,包括上面这位大哥的方法我都知道.
    但由于我查询的过程中出现了这样一来的现象.
    如果先取值后排序,那么对于20条记录,ORDER BY任何字段都会得到同样的记录,哪怕顺序不同.
    但我用了ORDER BY 不同的字段,居然得到的是不同的记录,于是才有这种疑惑了.
      

  5.   

    对于我的数据库的一个表,我用
    select * from tbi_sa06
    where rownum<10
    order by crd_no

    select * from tbi_sa06
    where rownum<10
    order by crd_depriv_mgt_no
    所查询的记录是不一样的.我的表的记录有40多条.
      

  6.   

    你是还有其他条件吧,如
    select * from tbi_sa06
    where ...>... and rownum<10
    order by crd_depriv_mgt_no
    这种情况下可能会不一样的
      

  7.   

    可惜的是没有其它的条件,不信你可以自己多造几条数据试试自己的表.
    我的表太大了,有80多个字段.所以不方便写出来.本来这个SQL与项目无关,是我自己发现了这个问题.
    难道你们没出现过吗?
      

  8.   

    排序+取前多少条的数据还是这样解决比较保险:
    1.Select * From (
    Select test.*, rank() over(Partition By monthid Order By gz Desc) rk From test)
    Where rk = 10
    ----oracle支持rank函数
    2.
    select * from test a
    where (select count(*) from test b where a.gz < b.gz and a.monthid = b.monthid) < 11
      

  9.   

    似乎和你的where处字段是否有索引有关系
    如果该sql不用索引,full table scan会根据数据的物理储存位置(一般先输入的先取出)取出在排序
    有索引,index range scan,那么取出来的值本来就有一定逻辑顺序,再排序的效果和上者就不太一样了
      

  10.   

    我的那个表没有索引
    WHERE处也没有其它字段.
    解决方法我知道!ROW_NUMBER()OVER(),RANK()OVER(),DENSE_RANK()OVER()我都会用.
    我只是发现了这么一个怪现象,请大家来参详一下而已!
      

  11.   

    我遇到过一个表的数据(没有改动过)在两个时间内查出的顺序不一样。
    查询语句就是select * from tablename
    这种情况只遇到过一次,以后就没遇到过了。sbaz(万神渡劫),你那个表一直这样吗?
      

  12.   

    和数据库优化器是ROB或COB模式也有关系..
      

  13.   

    ,ORACLE有一个优化器(Optimizer),ORACLE的优化机理就是从Optimizer开始的。明确两个概念:Optimizer 对ORACLE的优化方式有两种,一种是基于规则的,我们称为RBO(Rule-Based Optimization),一种是基于代价的CBO(Cost-Based Optimization),我们从字面就可基本理解这两个优化方式的含义,不错,RBO是根据ORACLE的内定规则实现的,比如我在“ORACLE性能调优原则”中讲到的:索引,索引就是ORACLE的内定规则;而对于CBO,由于是基于代价的,也就是ORACLE机器的资源了,比如CPU和内存等,这个时候有朋友就问了,既然有这两个方式,那ORACLE到底如何选择呢,其实,这个问题有一半需要我们自己回答,有一半由ORACLE回答。因为我们在安装ORACLE时就已决定了ORACLE到底调用什么方式,这个就是init.ora中设定的OPTIMIZER_MODE参数,如果我们设为OPTIMIZER_MODE=RULE,它就会按RBO方式进行,反之按CBO了。当然,我们在开发程序时也可认为的改变规则,如SQL:SELECT /*RULE*/  *  FROM  TABLE_NAME ,这个就使ORACLE强制使用RBO规则了,当然,ORACLE也比较“聪明”,它会根据用户检索表和该表的索引的统计信息来选择优化方式了,这里就出现了一个问题了,如果统计信息是陈旧的或者说是错误的,我们就必须用analyze人为的对表和索引进行重新统计了
      

  14.   

    我想你应该说的对吧.
    我的那个表,虽然两个SQL检索的记录不同,但我在不同的时间用两个中的某一条语句检索的记录还是一定的.
    希望大家多做试验,多交流一下,我暂不结帖.3天后结!
      

  15.   

    你多试一下吧,你用ORDER BY ... DESC可能结果都不一样呢,不信你试.
    不过你的数据要多点才行!
      

  16.   

    回复人: wbdx(碳离子) ( ) 信誉:100  2005-9-22 9:44:29  得分: 15  
    还有这种事情? GZ
    ----------------
    瞧这帖分数给的...巨受打击 ToT