SELECT * FROM (
       SELECT ROWNUM AS my_rownum,table_a.* FROM
       ( select * from T where object_id=20) table_a  
       WHERE ROWNUM <= 160 ) WHERE my_rownum > 140;

解决方案 »

  1.   

    表的嵌套查询,不知楼主说的那两个条件rownum<160还是my_rownum>140
      

  2.   

    因为ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简单的说 rownum 是对符合条件结果的序列号。它总是从1开始排起的。所以你选出的结果不可能没有1,而有其他大于1的值;假如写 where rownum>140 and  rownum<=160 总是会没有数据
    这里需要把rownum作为一个实际存在的字段,然后限制my_rownum>140
      

  3.   

    只要一次就可以了select *
      from (select t.*, rownum as rn from t)
     where rn > 140
       and rn <= 160;
      

  4.   

    简单来说,结果集中的rownum这个伪列的值必须从1开始,所以如果要找到从140开始的数据就得加一层转换,把这个rownum转换成一个真实的列my_rownum才行。
      

  5.   

    正解
    rownum是伪列,是对符合条件结果的序列号。总是从1开始的,比如1,2,3,4,5,6,7,8,9……
    只要你在条件里写rownum>n(n是个大于0的整数),那你得到的结果就是空,取不到数据。
    所以,一般采用套一层的写法,把rownum作为一个实际存在的字段,希望这样说能让楼主理解
      

  6.   


    rownum即先查到结果集之后再加上去的一个列 (强调:先要有结果集)
    当查出一条数据后,rownum对应的就是1,如果条件里存在>非0或>=1的数,当第一条数据出来之后判断where的时候他是错误的,下一条数据时rownum的初值还是从1开始,又会出现这种情况,最终一条数据也查不出来可以用一个条件 同 5 楼