ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [오라클] 1:1 질문과 답변 게시판 SQL 정리
    SQL 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로 내림차순을 한다.

     

    반응형

    댓글

Designed by Tistory.