SQL
[오라클] 1:1 질문과 답변 게시판 SQL 정리
dev.mk
2023. 9. 30. 17:22
반응형
프로세스 설명
- 답변은 한 번만 달 수 있다.
- 답변은 중복으로 달 수 없다.
- 목록에는 질문과 답변이 보여야함
테이블 생성
CREATE TABLE "BBS"
(
"BNO" NUMBER, -- 게시판번호
"PNO" NUMBER, -- 부모 게시판번호
"ID" VARCHAR2(100 BYTE), -- 작성자
"REG_DATE" DATE, -- 작성일
"TITLE" VARCHAR2(255 BYTE), -- 제목
"CONTENT" VARCHAR2(255 BYTE) -- 내용
)
임시 데이터 생성
SET DEFINE OFF;
Insert into BBS (BNO,PNO,TITLE,ID,CONTENT,REG_DATE) values (1,null,'제목1','test','내용1',to_date('23/09/30','RR/MM/DD'));
Insert into BBS (BNO,PNO,TITLE,ID,CONTENT,REG_DATE) values (2,null,'제목2','test','내용2',to_date('23/09/30','RR/MM/DD'));
Insert into BBS (BNO,PNO,TITLE,ID,CONTENT,REG_DATE) values (3,null,'제목3','test','내용3',to_date('23/09/30','RR/MM/DD'));
Insert into BBS (BNO,PNO,TITLE,ID,CONTENT,REG_DATE) values (4,null,'제목4','test','내용4',to_date('23/09/30','RR/MM/DD'));
Insert into BBS (BNO,PNO,TITLE,ID,CONTENT,REG_DATE) values (5,null,'제목5','test','내용5',to_date('23/09/30','RR/MM/DD'));
Insert into BBS (BNO,PNO,TITLE,ID,CONTENT,REG_DATE) values (6,null,'제목6','test','내용6',to_date('23/09/30','RR/MM/DD'));
Insert into BBS (BNO,PNO,TITLE,ID,CONTENT,REG_DATE) values (7,2,'제목2 > 답글','test','내용7',to_date('23/09/30','RR/MM/DD'));
Insert into BBS (BNO,PNO,TITLE,ID,CONTENT,REG_DATE) values (8,4,'제목4 > 답글','test','내용8',to_date('23/09/30','RR/MM/DD'));
Insert into BBS (BNO,PNO,TITLE,ID,CONTENT,REG_DATE) values (9,null,'제목7','test','내용9',to_date('23/09/30','RR/MM/DD'));
Insert into BBS (BNO,PNO,TITLE,ID,CONTENT,REG_DATE) values (10,1,'제목1 > 답글','test','내용10',to_date('23/09/30','RR/MM/DD'));
데이터 형태
원하는 결과
[HAS_REPLAY] 컬럼은 현재 질문의 답변이 있는지 확인한다.
[TYPE]컬럼은 현재 row가 질문인지 답변인지 구분한다.
SQL문
SELECT
BNO
, PNO
, TITLE
, CONTENT
, (
CASE
WHEN PNO IS NULL THEN BNO
ELSE PNO
END
) AS SORT
, ( SELECT DECODE(COUNT(*),1,'Y','N') FROM BBS AA WHERE AA.PNO = A.BNO) AS HAS_REPLY
, NVL2(PNO,'답변','질문') AS TYPE
FROM BBS A
ORDER BY SORT ASC , PNO DESC;
pno 컬럼 기준으로 case문을 이용하여 sort라는 정렬 필드를 얻는다.
order by로 sort를 오름차순, 그 후 pno로 내림차순을 한다.
반응형