这是我的一个查询语句,其中黑体的地方只能从BETWEEN 1 AND n能取到值,BETWEEN 2 AND n等都取不到值是什么原因? 
SELECT * FROM( 
select ROWNUM RECNO,aaa.new_id,aaa.new_title,aaa.new_user_name,aaa.new_time,aaa.new_restore, c.user_name rev_user_name ,aaa.rep_time,aaa.sta_id,aaa.cha_id  
from  (  select aa.*,row_number() over (partition by aa.new_id order by aa.rep_time desc) rn  
from(  select a.new_id,a.new_title,c.user_name new_user_name,a.new_time,a.new_restore,a.sta_id,a.cha_id,nvl(b.user_id,a.user_id) rev_user_id,nvl(b.rep_time,a.new_time) rep_time  
from xml_new a,xml_replay b,xml_user c  where a.new_id=b.new_id(+)  and a.user_id=c.user_id   and  a.user_id='181') aa order by aa.rep_time desc) aaa,  xml_user c  
where aaa.rev_user_id=c.user_id  and aaa.rn=1  and ROWNUM <= (11 + 10 - 1) ORDER BY ROWNUM ASC) 
WHERE ROWNUM BETWEEN 1 AND (11 + 10 - 1)

解决方案 »

  1.   

    rownum始终是从1开始的,是不可能跳过1从2开始的所以最后的ROWNUM BETWEEN 1 AND (11 + 10 - 1) 是不行的
      

  2.   

    SELECT 
            * 
    FROM 
            ( 
            SELECT 
                    ROWNUM RECNO , 
                    AAA.NEW_ID , 
                    AAA.NEW_TITLE , 
                    AAA.NEW_USER_NAME , 
                    AAA.NEW_TIME , 
                    AAA.NEW_RESTORE , 
                    C.USER_NAME REV_USER_NAME , 
                    AAA.REP_TIME , 
                    AAA.STA_ID , 
                    AAA.CHA_ID 
            FROM 
                    ( 
                    SELECT 
                            AA.* , 
                            ROW_NUMBER ( ) OVER ( PARTITION BY AA.NEW_ID 
                            ORDER BY 
                                    AA.REP_TIME 
                                    DESC ) RN 
                    FROM 
                            ( 
                            SELECT 
                                    A.NEW_ID , 
                                    A.NEW_TITLE , 
                                    C.USER_NAME NEW_USER_NAME , 
                                    A.NEW_TIME , 
                                    A.NEW_RESTORE , 
                                    A.STA_ID , 
                                    A.CHA_ID , 
                                    NVL ( B.USER_ID , A.USER_ID ) REV_USER_ID , 
                                    NVL ( B.REP_TIME , A.NEW_TIME ) REP_TIME 
                            FROM 
                                    XML_NEW A , 
                                    XML_REPLAY B , 
                                    XML_USER C 
                            WHERE 
                                    A.NEW_ID=B.NEW_ID ( + ) 
                                    AND A.USER_ID=C.USER_ID 
                                    AND A.USER_ID='181' ) AA 
                    ORDER BY 
                            AA.REP_TIME 
                            DESC ) AAA , 
                    XML_USER C 
            WHERE 
                    AAA.REV_USER_ID=C.USER_ID 
                    AND AAA.RN=1 
                    AND ROWNUM <= ( 11 + 10 - 1 ) 
            ORDER BY 
                    ROWNUM 
                    ASC ) 
    WHERE 
            ROWNUM BETWEEN 1 
            AND ( 11 + 10 - 1 ) 
      

  3.   

    不是吧,这不是oracle中slect top n 的方法吗?
    SELECT ID, NAME FROM 
                         ( 
                          SELECT ROWNUM RECNO, ID, NAME FROM 
                            (SELECT * FROM CUSTOMER ORDER BY NAME) 
                          WHERE ROWNUM <= (2 + 3 - 1) 
                          ORDER BY ROWNUM ASC 
                         ) 
                         WHERE RECNO BETWEEN 2 AND (2 + 3 - 1) 
      

  4.   

    ORACLE没有SELECT TOP(N)
    只有通过WHERE中的ROWNUM < N来做