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
반응형
'데이터베이스 > Oracle' 카테고리의 다른 글
[DB/Oracle] 무작위 20자리 문자열 키값 만들기 (년월일시분초 + 랜덤 6자리) (0) | 2025.09.16 |
---|---|
[Oracle] 오라클 순위 관련 함수(ROW_NUMBER, RANK, DENSE_RANK) (0) | 2021.06.10 |
[Oracle] 오라클 시간 관련 기능 - 세션 설정, 타임 존 변경 등 (0) | 2021.06.10 |
[Oracle] 오라클 ROWNUM과 BETWEEN을 이용한 조회 (0) | 2021.06.10 |
[Oracle] 오라클 정규표현식을 사용하여 문자열에서 핸드폰 번호가 있는 문자열 찾아내기 (0) | 2021.06.09 |
댓글