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로 내림차순을 한다.

 

반응형