프로그래머스_취소되지 않은 진료 예약 조회하기

임정민·2023년 6월 18일

SQL 문제풀이

목록 보기
53/53
post-thumbnail

문제

https://school.programmers.co.kr/learn/courses/30/lessons/132204

풀이

SELECT A.APNT_NO , P.PT_NAME , P.PT_NO , A.MCDP_CD, D.DR_NAME, A.APNT_YMD
    FROM APPOINTMENT A
    INNER JOIN PATIENT P
    ON A.PT_NO = P.PT_NO
    INNER JOIN DOCTOR D
    ON A.MDDR_ID = D.DR_ID
    WHERE DATE_FORMAT(A.APNT_YMD, "%Y-%m-%d") = '2022-04-13' AND APNT_CNCL_YN = 'N'
    ORDER BY A.APNT_YMD ASC;

다중 Join을 요구하는 문제였습니다. FROM A INNER JOIN B ON ~ INNER JOIN C ON ~ 구문으로 쉽게 해결할 수 있었습니다.🐏🐏🐏

처음에는 WITH 구문으로 아래와 같이


WITH PA AS
(
    SELECT *
        FROM PATIENT P
        INNER JOIN APPOINTMENT A
        ON P.PT_NO = A.PT_NO
) 
,DA AS
(
    SELECT *
        FROM DOCTOR D
        INNER JOIN APPOINTMENT A
        ON D.DR_ID = A.MDDR_ID
)

SELECT A.APNT_NO , P.PT_NAME , A.PT_NO , A.MCDP_CD, D.DR_NAME, A.APNT_YMD
    FROM APPOINTMENT A
    INNER JOIN PATIENT P
    ON A.PT_NO = P.PT_NO
    INNER JOIN DOCTOR D
    ON A.MDDR_ID = D.DR_ID
    WHERE DATE_FORMAT(A.APNT_YMD, "%Y-%m-%d") = '2022-04-13' AND APNT_CNCL_YN = 'N'
    ORDER BY A.APNT_YMD ASC;
    

PATIENT,APPOINTMENT / DOCTOR,APPOINTMENT 테이블들 간의 관계를 각각 정의하고 각 WITH 테이블을 호출하는 방식으로 해결하려고 했지만 올바른 문법이 아닌 이유로 실행되지 않았습니다. 그리하여 혹시 2개 이상의 테이블을 한번에 JOIN하는 방법이 있을까 하여 검색하였고 Multiple JOIN의 존재를 알게되어 해결할 수 있었습니다.🐎🐎🐎

저의 풀이 이외에

WITH result AS (
    SELECT A.apnt_no, A.pt_no, A.mddr_id, B.dr_name, A.mcdp_cd, A.apnt_ymd
    FROM appointment A JOIN doctor B
    ON A.mddr_id = B.dr_id
    WHERE A.mcdp_cd = 'CS' AND DATE_FORMAT(A.apnt_ymd, '%Y-%m-%d') = '2022-04-13' AND A.apnt_cncl_yn = 'N'
)

SELECT A.apnt_no, B.pt_name, B.pt_no, A.mcdp_cd, A.dr_name, A.apnt_ymd
FROM result A JOIN  patient B
ON A.pt_no = B.pt_no
ORDER BY A.apnt_ymd

DOCTOR , APPOINTMENT 테이블을 먼저 WITH 으로 정의하고 다시 이를 PATIENT 테이블과 JOIN하는 방식의 풀이를 볼 수 있었습니다.

감사합니다.

profile
https://github.com/min731

0개의 댓글