페이지 처리를 하는데 중간페이지부터 중복되는 게시물들이 나오고 있습니다.
기본뼈대는 아래와 같습니다.
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입니다.
왜 그럴까요???