
문제
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하는 방식의 풀이를 볼 수 있었습니다.
감사합니다.