오라클에서는 댓글이 있는 게시판 목록 쿼리를 만들때,
CONNECT BY 절을 사용해서 SQL를 작성하는데,
IBM DB2에서는 CONNECT BY를 지원하지 않기 때문에 다른 꼼수를 사용해야 한다.
옆자리 개발자가 해결을 못하고 있다고 해서,
그 게시판 목록 조회 SQL을 봐주기로 답변은 덜커덩 했지만,
DB2를 마지막으로 사용해본지가 10년도 넘었으니,
구글을 뒤지던 네이버를 뒤지면 비슷한걸 찾을 수 있겠지라고 쉽게 생각했었다..
그런데...
인터넷에서는 내가 필요로 하는 기능요건에 맞는 설명이나 샘플을 찾지 못했다.
그래서...
어쩔 수 없이, 이제는 별로 쓸모없어진 내 머리를 믿기로 하고 스스로 쿼리 만들기로 했다.^^
그리고...
오랜만에 열업(열심히 업무)해서 예쁘게 만들어냈다. 야호~~~
DB2로 게시판 목록 조회 SQL이 필요하신 분은 아래 참조해서 유용하게 쓰세요~~
아참, 아래에 적어놓은 내용은
저의 동의없이 맘대로 무한 배포, 복사, 편집, 퍼나르기를 조건없이 환영합니다~
그럼, 설명 들어갑니다..
1. 게시판 목록 UI의 구현 조건 정의
(1) 가장 최근의 글이 가장 상단에 나타나야한다(Descend)
(2) 댓글은 본문글 아래에 오래된 댓글순(Ascend)으로 보여야 한다
(3) 댓글의 댓글의 깊이는 무한이 계속될 수 있다
2. 게시판 테이블의 칼럼 정의
(1) GROUP_ID
- 최상위 본글의 BOARD_ID. 본글을 포함하여, 하위의 모든 댓글들은 같은 GROUP_ID를 갖도록 한다.
(2) PARENT_BOARD_ID
- 직전 상위 글의 BOARD_ID. 최상위 본글 PARENT_BOARD_ID는 DEFAULT값인 0을 갖도록 한다.
(3) REPLY_DEPTH
- 화면 출력시 들여쓰기의 기준.
- DEFAULT는 0. 최상위 본글은 0이고, 이하 댓글은 직전 상위글의 REPLY_DEPTH에 1을 더한다.
3. 실행 SQL
--------------------------------------------------------------------------------------------------------
WITH RECURSIVE(RECURSIVE_LEVEL, BOARD_ID, PARENT_BOARD_ID, GROUP_ID, REPLY_DEPTH) AS
(
SELECT CAST(BOARD_ID AS VARCHAR(100)) AS RECURSIVE_LEVEL,
BOARD_ID, PARENT_BOARD_ID, GROUP_ID, REPLY_DEPTH
FROM BBS_TABLE
WHERE BOARD_ID = GROUP_ID
UNION ALL
SELECT T.RECURSIVE_LEVEL || '.' || T.BOARD_ID AS RECURSIVE_LEVEL,
C.BOARD_ID, C.PARENT_BOARD_ID, C.GROUP_ID, C.REPLY_DEPTH
FROM BBS_TABLE C, RECURSIVE T
WHERE C.PARENT_BOARD_ID = T.BOARD_ID
)
SELECT (RECURSIVE_LEVEL || '.' || BOARD_ID ) as RECURSIVE_LEVEL,
BOARD_ID, PARENT_BOARD_ID, GROUP_ID, REPLY_DEPTH
FROM RECURSIVE A
ORDER BY GROUP_ID DESC, RECURSIVE_LEVEL ASC
--------------------------------------------------------------------------------------------------------
※ 자세히 설명을 적었지만,
혹시라도 다시 설명이 필요한분은 댓글에 질문하시거나,
이메일로 연락(urajilation@gmail.com) 주시면 부연설명을 해드리겠습니다.
From. 부산에서 출장 프로젝트중인 황사마.^^