表中记录太多,一次不能全部装入本地机器内存。想每次取一定数量的记录,用rownum可以嘛?怎么写语句?

解决方案 »

  1.   

    select * from (select rownum r,a.* from tbname a) where r between m and n
      

  2.   

    同类问题问得太多了,去看看faq
      

  3.   

    利用rownum就可以了
    select * from (select rownum rowid,a.* from tbname a) where rowid between 50 and 100
      

  4.   

    select * from table where rownum <= m
    minus
    select * from table where rownum < n;
      

  5.   

    to  xhy818:<<
    select * from (select rownum rowid,a.* from tbname a) where rowid between 50 and 100
    >>  你不知道rowid是oracle的保留字吗?你自己测试一下先
      

  6.   

    最好不要用oracle中的关键字,如果要用,请加引号:select * from (select rownum "rowid",a.* from fnd_user a) where "rowid" between 50 and 100
      

  7.   

    从性能上讲,
    select * from table where rownum <= m
    minus
    select * from table where rownum < n;

    select * from (select rownum r,a.* from tbname a) where r between m and n
    快。前者对表扫描次数比后者少。
    楼主说,表中的纪录太多,所以在大数据量时尤其应该考虑相应时间。所以,本人支持前者。
      

  8.   

    在这样的情况下还能不能加个条件呢,如里面有一个字段,dept_no为01的
      

  9.   

    biliky()的说法严重错误!
    自己先做一个explain plan再下结论
      

  10.   

    首先感谢大家的参与。对sql语句老是用性能来分析,并且上升到理论高度,这才是真正的数据库高手。所以,尤其感谢 drabit,biliky,dxwsh的深入分析。我觉得oracle具体怎么做内部的优化处理,我们局外人也许永远无法得知,毕竟这是甲骨文的核心技术。但是,我觉得select * from (select rownum rno......)... 的方法效率,感觉扫描表的次数恰恰比minus方法少。无论如何,谢谢大家。
      

  11.   

    quote:<我觉得oracle具体怎么做内部的优化处理,我们局外人也许永远无法得知>oracle的内部优化规则文档上说的很清楚,而且掌握优化规则是一个dba的基本要求