본문 바로가기
데이터베이스/Oracle

[DB/Oracle] 계층형 쿼리로 Q&A 게시판 구현하기

by drCode 2025. 9. 17.
728x90
반응형

 

게시판을 만들다 보면 질문(Question)과 답변(Answer) 구조를 처리해야 하는 경우가 많다.

특히 Q&A 게시판은 단일 테이블(TB_POST)에 질문과 답변을 함께 저장하면서, 부모-자식 관계를 이용해 계층 구조로 표현한다.

 

오늘은 CONNECT BY 를 활용해 이를 구현하는 방법을 정리해보자.

 

❓ Q1. Q&A 게시판에서 질문과 답변을 어떻게 구분하는가?

Q&A 구조에서는 보통 다음과 같이 데이터를 관리한다.

  • 질문글 → PARENT_POST_ID 가 NULL
  • 답변글 → PARENT_POST_ID 에 질문글의 POST_ID 값 저장

즉, 부모가 없으면 질문, 부모가 있으면 답변으로 구분할 수 있다.

아래 쿼리에서는 CASE WHEN 문으로 질문/답변 구분 컬럼(GUBUN)을 만들어준다.

CASE WHEN POST.PARENT_POST_ID IS NULL THEN 'Q' ELSE 'A' END AS GUBUN
 

❓ Q2. 부모 질문 제목을 함께 가져오려면 어떻게 하는가?

답변만 봐서는 어떤 질문에 대한 답변인지 알기 어렵다.
이를 해결하기 위해, PARENT_POST_ID 를 이용해 부모 글의 제목을 가져올 수 있다.\

 

(
    SELECT SUB.POST_TITL_NM
      FROM TB_POST SUB
     WHERE SUB.POST_ID = POST.PARENT_POST_ID
) AS PARENT_POST_TITL_NM
 

❓ Q3. 계층 구조로 질문 → 답변 순서대로 조회하려면?

Oracle에서는 START WITH ... CONNECT BY 구문을 이용해 계층 구조를 표현할 수 있다.

START WITH POST.PARENT_POST_ID IS NULL
CONNECT BY PRIOR POST.POST_ID = POST.PARENT_POST_ID
ORDER SIBLINGS BY POST.FS_IN_DTM DESC

 

 

  • START WITH : 계층의 시작점을 지정 (여기서는 질문글, 즉 부모가 없는 글)
  • CONNECT BY PRIOR : 부모-자식 관계 정의
  • ORDER SIBLINGS BY : 같은 레벨 내 정렬 기준 (최신 등록일 순 정렬)

 

※ 최종 쿼리

아래는 Q&A 게시판을 계층형으로 조회하는 최종 SQL이다.

SELECT POST.POST_ID
      ,CASE WHEN POST.PARENT_POST_ID IS NULL THEN 'Q' ELSE 'A' END AS GUBUN
      ,POST.BOARD_ID
      ,POST.PARENT_POST_ID
      ,(
          SELECT SUB.POST_TITL_NM
            FROM TB_POST SUB
           WHERE SUB.POST_ID = POST.PARENT_POST_ID
       ) AS PARENT_POST_TITL_NM
      ,POST.POST_TITL_NM
      ,POST.POST_TXT
      ,POST.INQ_CNT
      ,POST.GOOD_CHO_NUM
  FROM TB_POST POST
  JOIN TB_BOARD BOARD
    ON POST.BOARD_ID = BOARD.BOARD_ID
 WHERE POST.DEL_YN  = 'N'
   AND BOARD.DEL_YN = 'N'
   AND BOARD.USE_YN = 'Y'
   AND POST.BOARD_ID = 'Q&A'
 START WITH POST.PARENT_POST_ID IS NULL
CONNECT BY PRIOR POST.POST_ID = POST.PARENT_POST_ID
ORDER SIBLINGS BY POST.FS_IN_DTM DESC;

✅ 정리

  • CASE WHEN 으로 질문/답변 구분
  • PARENT_POST_ID 를 이용해 부모 질문 제목 조회
  • START WITH ... CONNECT BY 로 계층형 구조 구현

이렇게 하면 하나의 테이블로 Q&A 게시판을 깔끔하게 표현할 수 있다.

 

728x90
반응형

댓글