정말 오랜만에 쓰는 TIL,,,
다시 열심히 기록해보자,,~!
오늘 아침에 코드카타를 하면서 레벨이 좀 높은 문제에 도전했다.
[취소되지 않은 진료 예약 조회하기]
PATIENT, DOCTOR 그리고 APPOINTMENT 테이블에서 2022년 4월 13일 취소되지 않은 흉부외과(CS) 진료 예약 내역을 조회하는 SQL문을 작성해주세요. 진료예약번호, 환자이름, 환자번호, 진료과코드, 의사이름, 진료예약일시 항목이 출력되도록 작성해주세요. 결과는 진료예약일시를 기준으로 오름차순 정렬해주세요.
문제를 읽었을 때 조건이 그리 복잡해보이지는 않는다. 다만, 세 개의 테이블을 합쳐야해서 난이도가 조금 높아 보일 뿐
SELECT a.PT_NO, a.APNT_NO, a.APNT_YMD, a.MDDR_ID, a.PT_NAME, d.MCDP_CD, d.DR_NAME
FROM (SELECT *
FROM (SELECT PT_NO, APNT_NO, APNT_YMD, APNT_CNCL_YN, MDDR_ID
FROM APPOINTMENT
) a
INNER JOIN
(SELECT PT_NO, PT_NAME
FROM PATIENT
) p
ON a.PT_NO = p.PT_NO
WHERE APNT_YMD LIKE '2022-04-13%'
AND APNT_CNCL_YN = 'N'
) a
INNER JOIN
(SELECT DR_ID, MCDP_CD, DR_NAME
FROM DOCTOR
) d
ON a.MDDR_ID = d.DR_ID
WHERE d.MCDP_CD = 'cs'
ORDER BY a.APNT_YMD
처음에는 대강 이런식으로 코드를 먼저 짜봤다.
근데 아래와 같은 에러 발생,,
SQL 실행 중 오류가 발생하였습니다.
Duplicate column name 'PT_NO'
처음에는 에러 메세지를 제대로 안 읽고 PT_NO를 제대로 못찾나 했는데 그게 아니라 컬럼이 중복되는 것..
제일 안에 조인한 예약 테이블과 환자 테이블을 조인한 것 까지는 제대로 실행이 되지만 의사 테이블과 합친 메인 쿼리에서 자꾸만 저런 에러가 발생했다.
원인은 바로, 예약 테이블과 환자 테이블을 조인 할 때 둘의 교집합인 PT_NO로 묶고 SELECT *을 사용하여 모든 컬럼이 다 나오도록 했다.
여기까지는 괜찮지만 이 조인한 테이블을 다시 의사 테이블과 조인할 때 에러가 발생하는 것
아주 중요한 규칙
SELECT a.APNT_NO, a.PT_NAME, a.PT_NO, d.MCDP_CD, d.DR_NAME, a.APNT_YMD
FROM (SELECT a.PT_NO, a.APNT_NO, a.APNT_YMD, a.APNT_CNCL_YN, a.MDDR_ID, p.PT_NAME
FROM (SELECT PT_NO, APNT_NO, APNT_YMD, APNT_CNCL_YN, MDDR_ID
FROM APPOINTMENT
) a
INNER JOIN
(SELECT PT_NO, PT_NAME
FROM PATIENT
) p
ON a.PT_NO = p.PT_NO
WHERE APNT_YMD LIKE '2022-04-13%'
AND APNT_CNCL_YN = 'N'
) a
INNER JOIN
(SELECT DR_ID, MCDP_CD, DR_NAME
FROM DOCTOR
) d
ON a.MDDR_ID = d.DR_ID
WHERE d.MCDP_CD = 'cs'
ORDER BY a.APNT_YMD
서브 쿼리 안에서 필요한 컬럼을 하나만 선택하여 조인하니 오류 없이 실행 되었다!
추가로 아래처럼 조인을 계속 써서 간단하게 쿼리를 작성할 수도 있다
SELECT a.APNT_NO, p.PT_NAME, p.PT_NO, d.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 a.APNT_YMD LIKE '2022-04-13%'
AND a.APNT_CNCL_YN = 'N'
AND d.MCDP_CD = 'cs'
ORDER BY a.APNT_YMD

정답 화면~