select * from (select id, rownum rownum_ from (SELECT id FROM t1)) where rownum_ <= 20 and rownum_ > 10;如果id是字符串型则正常,但如果id是数字型,则得出的结果不是实际的数据,而是和rownum一个的数字,如下:
      ID    ROWNUM_
---------- ----------
        11         11
        12         12
        13         13
        14         14
        15         15
        16         16
        17         17
        18         18
        19         19
        20         20上面只是查id,如果再加查一列,查出的id数据就正常了:
select * from (select id, deptid, rownum rownum_ from (SELECT id, deptid  FROM t1)) where rownum_ <= 20 and rownum_ > 10;       ID     DEPTID    ROWNUM_
---------- ---------- ----------
      3900          2         11
      3901          2         12
      3902          2         13
      3903          2         14
      3904          2         15
      3905          2         16
      3906          2         17
      3907          2         18
      3908          2         19
      3909         16         20

解决方案 »

  1.   

    如果没有排序,试试这个select /*+ ordered use_nl(x,y) */
           y.*
    from   (select /*+ first_rows */ rid
            from   (select /*+ first_rows */ 
                           rowid  rid,
                           rownum rn
                    from   t1
                    where  rownum<=20)
            where  rn>=11) x,
           t1 y
    where  x.rid=y.rowid;
      

  2.   

    不应当,我在我电脑上测试了没有问题
    select * from (select fee3, rownum rownum_ from (SELECT fee3 FROM tb)) where rownum_ <= 10 and rownum_ > 3;fee3     rownum_
    10 4
    20 5
    20 6
    10 7
    12 8
    2 9
      

  3.   

    查看执行计划,看看
    select * from (select id, rownum rownum_ from (SELECT id FROM t1)) where rownum_ <= 20 and rownum_ > 10;
    是否与
    select * from (select id, deptid, rownum rownum_ from (SELECT id, deptid  FROM t1)) where rownum_ <= 20 and rownum_ > 10;
    的执行计划不一样。猜测前一个用的是INDEX FAST FULL SCAN,后一个是table full scan。
      

  4.   

    嗯,自己trace一下看看。特别当t1是一个比较复杂的视图的时候。
      

  5.   

    最里面的嵌套有点多余,
    select * from (select id, rownum rownum_ from FROM t1) where rownum_ <= 20 and rownum_ > 10