SQL_서브쿼리를 만들 때 주의할 점

김채윤·2025년 11월 12일

정말 오랜만에 쓰는 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 *을 사용하여 모든 컬럼이 다 나오도록 했다.
여기까지는 괜찮지만 이 조인한 테이블을 다시 의사 테이블과 조인할 때 에러가 발생하는 것

예약 테이블과 환자 테이블을 합칠 때에는 둘이 a와 p로 구분되기 때문에 PT_NO도 따로 인식되지만 다시 이걸 a로 묶어서 의사 테이블과 합칠 경우 a.PT_NO 컬럼이 두 개 생성되는 것이다.

서브쿼리의 컬럼 이름은 유일해야 한다

아주 중요한 규칙

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


정답 화면~

0개의 댓글