오라클 게시판 다음글 이전글

구성욱·2022년 12월 29일
0

Oracle

목록 보기
3/3

게시판에 작성된 게시글을 클릭해서 상세한 내용을 볼 때 하단에 다음글과 이전글에 대한 정보가 있는 케이스를 접하기 쉽다.

테이블 자체에 시퀀스에 대한 컬럼으로 제어하는 것이 좋지만 게시글이 삭제되면 시퀀스로 제어가 어려워진다.

그래서 찾게 된 방법에는 아래의 두 가지 방법이 있었다.

  • ROWNUM 활용
  • LAG, LEAD 함수 활용

1. ROWNUM의 활용

ROWNUM은 게시판의 리스트 정보를 프론트 단에 넘겨줄 때 부터 ROWNUM에 대한 정보를 전달하고 상세 보기를 진행할 때 해당 ROWNUM 값을 전달 받아서 처리하는 방법이다.

SELECT
	ROWNUM AS rnum,
    BOARD_ID,
    TITLE,
    CRE_TIME,
    CRE_ID
FROM EXAMPLE_TABLE
ORDER BY BOARD_ID

이런 식으로 조회를 진행하고 rnum에 대한 정보를 수신한 후에 실행하는 쿼리에는

SELECT * FROM (
	SELECT
        ROWNUM AS rnum,
        BOARD_ID,
        TITLE,
        CRE_TIME,
        CRE_ID
    FROM EXAMPLE_TABLE
    ) A
WHERE A.rnum BETWEEN (ROWNUM - 1) AND (ROWNUM + 1)

2. LAG, LEAD 함수의 활용

SELECT
	*
FROM
	(SELECT
    	LAG(BOARD_SEQ, 1) OVER(ORDER BY BOARD_SEQ) AS BF_SEQ,
        LAG(SUBJECT, 1) OVER(ORDER BY BOARD_SEQ) AS BF_SUBJECT,
        LAG(CRE_DTM, 1) OVER(ORDER BY BOARD_SEQ) AS BF_CRE_DTM,
        BOARD_SEQ,
        LEAD(BOARD_SEQ, 1) OVER(ORDER BY BOARD_SEQ) AS AFT_SEQ,
        LEAD(SUBJECT, 1) OVER(ORDER BY BOARD_SEQ) AS AFT_SUBJECT,
        LEAD(CRE_DTM, 1) OVER(ORDER BY BOARD_SEQ) AS AFT_CRE_DTM
	FROM TBC_BOARD_I
    WHERE 1 = 1
      AND USE_YN = 'Y'
      AND DEL_YN = 'N'
      AND BOARD_LVL = 0
      AND BOARD_ID = #{보드ID}) A
WHERE
	A.BOARD_SEQ = #{시퀀스값}

위와 같이 LAG, LEAD 함수를 사용해 쿼리를 구성하면 가변적인 ROWNUM 값을 받아 처리하지 않고 값을 전달 받아 처리가 가능하다

LAG(컬럼[, 오프셋]) : 이전 값 OVER(ORDER BY 기준이 될 컬럼)
LEAD(컬럼[, 오프셋]) : 다음 값 OVER(ORDER BY 기준이 될 컬럼)

OVER 함수 안에는 PARTITION BY 키워드를 활용할 수도 있다.

profile
아무것도 몰라요우

0개의 댓글