봄꾸
1k
2020-02-28 14:17:59 작성 2020-02-28 14:19:07 수정됨
2
204

서브 쿼리 결과의 ROW_NUMBER() 값이 변경됩니다;; 도와주세요!


SELECT SEQ, NUM, CATEGORY_TYPE_NM

FROM (SELECT ROW_NUMBER() NUM, * FROM A)

WHERE RNUM BETWEEN 1 AND 20; 과 같이 ROW_NUMBER()를 이용한 페이징 쿼리를 사용하고 있는데요,

서브 쿼리로 감싼 후 WHERE 조건을 사용하기 때문에 ROW_NUMBER가 쿼리 결과에 따라 변경될 수가 없는 경우인데 WHERE NUM BETWEEN 1 AND 20 과  같이 조건 절을 주었을 때 쿼리 결과가 다르고 RNUM 값이 변경됩니다. 이미 서브쿼리로 조회된 NUM 인데 왜 변경이 되는지 잘 모르겠습니다

위 사진이 WHERE 조건을 주기 전 결과입니다.


그리고 각각 BETWEEN 1~10 11~20 21~30 의 결과입니다.

0
  • 답변 2

  • 콘푸로스트
    1k
    2020-02-28 15:12:38

    ROWNUM을 줄때는 정렬을 해줘야, 정확한 넘버링이 됩니다.

    좀 고전적으로 쿼리를 짜봤습니다.


    SELECT
    	*
    FROM 
    (
    	SELECT
    		A.*
    		, ROWNUM AS NUM /* 2. 서브쿼리에서 이미 ROW가 SEQ으로 정렬되었기 때문에, SEQ의 차순으로 넘버링이 됩니다. */
    	FROM 
    	(
    		SELECT 
    			SEQ
    			, CATEGORY_TYPE_NM
    		FROM A
    		ORDER BY SEQ /* 1. SEQ컬럼 기준으로, ROW를 전체 정렬합니다. */
    	) A
    	WHERE 1=1
    	  AND ROWNUM <= 20 /* 3. SEQ기준으로 상위 20개의 ROW만 조회합니다. */
    )
    WHERE 1=1
      AND NUM > 10


  • 례구
    413
    2020-02-28 15:47:55

    안되면 서브쿼리 한번 더 감싸서... 테스트는 안해봤네요....

    SELECT S1.* FROM 

    (

    SELECT S.SEQ, S.NUM, S.CATEGORY_TYPE_NM

    FROM (

    SELECT ROW_NUMBER() NUM

           , A.* 

    FROM A

       ) S

    ) S1 

    WHERE S1.RNUM BETWEEN 1 AND 20; 

  • 로그인을 하시면 답변 을 등록할 수 있습니다.