应该是这样的吧:
select * from demo where rownum<1000010 
minus 
select * from demo where rownum<1000000表示取第1000000开始的10条记录**************泪眼问花花不语
乱红飞过秋千去

解决方案 »

  1.   

    对,SQL写反了,呵呵
    查询结果的意思我是知道的,我只是想知道他的实际效率如何?
    尤其是数据量在几百万条记录的时候
      

  2.   

    select * from demo where rownum<1000010 
    minus 
    select * from demo where rownum<1000000
    的写法我在sql/plus 报错:数据类型不一致
    我的写法:
    select ygid from (select rownum rn,ygid from t_ygjbxx) where rn>100 and rn<5000
      

  3.   

    这种写法可能更快:
    select ....  from 
    ( select rownum rm,demo.*  from demo )
    where rm between 1000000 and 1000010;
      

  4.   

    参见:http://www.csdn.net/expert/topic/665/665679.xml?temp=.3550226select * from (select rownum r,a.* from yourtable a where rownum <= 1000010) where r >= 1000000
      

  5.   

    楼上的用到了嵌套,
    我觉着还是 jlandzpa(ORA-00600)的应该更快才是
      

  6.   

    select * from demo where rownum<1000000 
    minus 
    select * from demo where rownum<1000010
    这个效率不高的话,应该没有高的了
      

  7.   

    没测试过不要乱开口,自己测试一下便知道了。
    http://www.csdn.net/expert/topic/665/665679.xml?temp=.3550226
    此帖是精华帖,不信去看看讨论结果。
      

  8.   

    语句:
    select * from demo where rownum<1000010 
    minus 
    select * from demo where rownum<1000000
    执行性能很差,因为要进行大量的比较操作。
    还有这个SQL没有Order by是没有多大意义的。
    大家举的都是2层嵌套,这需要Order by 的字段有索引,不信用可以不按顺序插入数据试试。
    我记得有一个三层嵌套的语句可以解决这个问题,一时记不起来,找到了发给大家。
      

  9.   

    那里有人用minus,简直是浪费CPU。一般是用and的最快,between的其次。几百万条数据用minus比较,用膝盖想想都知道有问题。
      

  10.   

    select
    *
    from
    table_name
    where
    rownum>100000
    and 
    rownum<100010
    这样就可以了。
      

  11.   

    tompeng:
    这样是选不出来的。
    rownum不能这样用
      

  12.   

    如果数据是连续的话,
    最快的方式就是通过rowid来取,
      

  13.   

    我做了一下简单测试
    测试环境:oracle8.1.5, win2000 server, 128M内存
    测试过程:使用表tb(name,age),表中有500000数据
    每次都是重新启动数据库后运行查询语句SQL> set timing on
    SQL> select * from tb where rownum<400000
      2  minus
      3  select * from tb where rownum<399990;NAME             AGE
    ---------- ---------
    n399990       399990
    n399991       399991
    n399992       399992
    n399993       399993
    n399994       399994
    n399995       399995
    n399996       399996
    n399997       399997
    n399998       399998
    n399999       399999已选择10行。实际:34266SQL> set timing on
    SQL> select * from ( select rownum id,tb.* from tb where rownum<400000) where id>=399990;       ID NAME             AGE
    --------- ---------- ---------
       399990 n399990       399990
       399991 n399991       399991
       399992 n399992       399992
       399993 n399993       399993
       399994 n399994       399994
       399995 n399995       399995
       399996 n399996       399996
       399997 n399997       399997
       399998 n399998       399998
       399999 n399999       399999已选择10行。实际:16172SQL> set timing on
    SQL> select * from tb where rowid>='AAADEgAABAAAYYLAAM' and rowid<='AAADEgAABAAAYYLAAV';NAME             AGE
    ---------- ---------
    n399990       399990
    n399991       399991
    n399992       399992
    n399993       399993
    n399994       399994
    n399995       399995
    n399996       399996
    n399997       399997
    n399998       399998
    n399999       399999已选择10行。实际:4517
    测试结果:使用minus用的时间最长,其次是使用rownum,最快的就是使用rowid,但要先知道起始位置rowid;
      

  14.   

    如果加上order by 的话,
    select * from ( select rownum id,tb.f1,tb.f2 from tb where rownum<400000 order by tb.f1) where id>=399990;
    测试结果并不是对全部记录进行的排序,而是对选出的数据进行的排序
    怎样解决前者
      

  15.   

    我也做了测试,在1000000条记录中,的确
    select * from tb where rownum<1000000
        minus
    select * from tb where rownum<999990;
    平均需要8.43秒
    select * from ( select rownum id,tb.* from tb where rownum<1000000) where id>=999990
    平均需要1.83秒
      

  16.   

    呵呵 我没有觉得这个话题需要做这么大的争论。
    其实最简单的方法是把以上方案都做test。
    让事实说话。
      

  17.   

    按的问题被淹没了:如果加上order by 的话,
    select * from ( select rownum id,tb.f1,tb.f2 from tb where rownum<400000 order by tb.f1) where id>=399990;
    测试结果并不是对全部记录进行的排序,而是对选出的数据进行的排序
    怎样解决前者
      

  18.   

    TO cd_dragon(栋栋)select * from ( select rownum id,cd.* from (select * from gdw_cd  order by cdbm) cd where rownum<10000) where id>=9980
      

  19.   

    我的测试数据如下:
    测试结果
    SQL> select * from demo where rownum<400000
      2  minus
      3  select * from demo where rownum<399990;        ID NAME
    ---------- --------------------
        399990 GH0399990
        399991 GH0399991
        399992 GH0399992
        399993 GH0399993
        399994 GH0399994
        399995 GH0399995
        399996 GH0399996
        399997 GH0399997
        399998 GH0399998
        399999 GH0399999已选择10行。已用时间:  00: 00: 14.00
    SQL> select * from ( select rownum rnum,demo.* from demo where rownum<400000) where rnum>=399990;      RNUM         ID NAME
    ---------- ---------- --------------------
        399990     399990 GH0399990
        399991     399991 GH0399991
        399992     399992 GH0399992
        399993     399993 GH0399993
        399994     399994 GH0399994
        399995     399995 GH0399995
        399996     399996 GH0399996
        399997     399997 GH0399997
        399998     399998 GH0399998
        399999     399999 GH0399999已选择10行。已用时间:  00: 00: 00.21
      

  20.   

    Oracle的rownum变量只支持<符号,>以及=都是不支持的,楼上有很多人都闹了笑话,不相信你试试看
      

  21.   

    这是我提到的关于3层嵌套的例子
    select results.* from   
    ( select t2.*, rownum rownumber from   
    ( select t.* from mv_table t where order by col1) t2) results   
    where results.rownumber between 30 and 50 order by col1  大家提到的都是2层的,这需要order by的字段是主键或是唯一索引!!!!!!,不信用非顺序插入数据试试。
      

  22.   

    tompeng(Tomcat) :ROWNUM怎么可以用">"???
      

  23.   

    minus这种做法效率太低了,既耗时,又耗内存,比其他的方法差好几倍(从试验中得来)
      

  24.   

    因为minus是遍历两次表,如果用rownum只是遍历一次表,然后在从结果集(内存)中找结果
      

  25.   

    很显然,minus不论如何,都将比ROWNUM所花的时间多。
      

  26.   

    我想用select
    *
    from
    table_name
    where
    rownum>100000
    and 
    rownum<100010可能要好点,我现在就在处理这样的事情,在几百万条数据中进行分类转移,正叫个痛苦。我是在前台用DELPHI开发的程序进行海量数据处理,不过如果能把查询语句作为一种线程处理不管是速度还是性能都要好快点
    事实上也的确如此,如果在纯ORACLE下进行可能要累死人了:)
      

  27.   

    liu800323(飞机) :这样写是错的.