SELECT *
  FROM (SELECT *
          FROM (SELECT ROWNUM AS ROW_ID, ORDER_ID
                  FROM ORDERS
                 ORDER BY ORDER_ID DESC) A
         WHERE ROW_ID < 10)
 WHERE ROW_ID >= 5;--上面这样写是错误的。正确写法:
SELECT B.ORDER_ID,B.ORDER_DETAILS,B.R_ID
  FROM (SELECT A.ORDER_ID,A.ORDER_DETAILS,ROWNUM AS R_ID      --对排序好的结果取其rownum,再取rownum 小于给定值的记录(不能直接对rownum取大于)
          FROM (SELECT ORDER_ID,ORDER_DETAILS       --获取排序好的结果集
                  FROM ORDERS
                 ORDER BY ORDER_ID DESC) A
         WHERE ROWNUM < 10) B
 WHERE R_ID >= 5;  为什么上面是错的 ,而第二个加了别名就是正确的。                  

解决方案 »

  1.   

    在一次查询中,既排序,又去伪列(ROWNUM),肯定是不对的。你可以看看ROWNUM中的序号是不是对的了
      

  2.   

    换个位置试试select * 
    from (select t1.*,rownum rn 
         from (select ORDER_ID 
               from ORDERS 
               ORDER BY ORDER_ID DESC
              ) t1
         where  rownum <10
         )
    where rn>=5SELECT *
      FROM (SELECT *
      FROM (SELECT ROWNUM AS ROW_ID, ORDER_ID
      FROM ORDERS
      ORDER BY ORDER_ID DESC) A
      WHERE ROW_ID < 10)
     WHERE ROW_ID >= 5;