페이지 처리 질문. 0 2 2,402

by 공상돌이 [SQL Query] order by 페이지 [2014.04.23 16:31:58]


444.jpg (85,989Bytes)

페이지 처리를 하는데 중간페이지부터 중복되는 게시물들이 나오고 있습니다.

기본뼈대는 아래와 같습니다.

SELECT   *
FROM
       (
         SELECT   /*+ FIRST_ROWS */
                  QUERY.*
                , ROWNUM RN
         FROM
                (

                  /* 데이터를 가져오는 쿼리 */
                  SELECT
                  FROM
                  WHERE
                  AND
                  ORDER BY
                ) QUERY
         WHERE    ROWNUM <= (:1 * 10)
       )
WHERE    RN >= ((:1-1) * 10)

이것을 아래처럼 바꾸었습니다.


SELECT * FROM (SELECT ROWNUM rnum, m.* FROM (
SELECT 여러 컬럼, 
               NVL(k.CNT,0) AS 피드백1,
               NVL(s.CNT,0) AS 피드백2
          FROM h테이블 h, (피트백1 수 구하는 서브쿼리) k, 
                                     (피트백2 수 구하는 서브쿼리) s
         WHERE h.ISMASTER = 1
           AND h.ID = k.ID(+)
           AND h.ID = s.ID(+)
         order by (피드백1+피드백2) desc
      ) m WHERE ROWNUM <= 250) WHERE rnum > 240
      ;

피드백1과 피드백2를 합산한 결과로 정렬을 해야해서 저렇게 해놨는데...

한페이지 당 10개씩 게시물이 나오는데 order by를 하지 않은 경우 정상적으로 페이지 출력이 됩니다.

하지만 order by를 하게 되면 중후반쯤부터 게시물이 겹치는걸 확인했습니다.

왜그럴까 하다가 이렇게 확인하는게 맞는지는 모르지만 임의로 ROWNUM이 250 이하 일 경우와 240 이하 일 경우  두 쿼리를 조인시켜서 비교해보니 첨부한 이미지 처럼 나왔습니다.

QID가 ROWNUM이 250이하 일때고, WID가 ROWNUM이 240 이하일 때입니다.

그리고 QNUM과 WNUM이 각각의 ROWNUM입니다.

왜 그럴까요???

by 마농 [2014.04.23 17:02:57]

정렬조건값이 유니크하지 않아서 그렇습니다.
같은 정렬키값이 여러개 중복될 경우 중복된것끼리는
어느것이 먼저 나올지 나중 나올 지를 장담할 수 없습니다.
유니크한 항목을 정렬조건으로 추가하세요.
order by (피드백1+피드백2) desc, pk
order by (피드백1+피드백2) desc, rowid


by 공상돌이 [2014.04.23 17:43:24]

감사합니다^^

마농님 말씀대로 고쳤더니 해결되었습니다!!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입