SQL

3개 이상의 테이블 JOIN

zzugest1 2023. 1. 5. 21:04

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

PATIENT, DOCTOR 그리고 APPOINTMENT 테이블에서 2022년 4월 13일 취소되지 않은 흉부외과(CS) 진료 예약 내역을 조회하는 SQL문을 작성해주세요. 진료예약번호, 환자이름, 환자번호, 진료과코드, 의사이름, 진료예약일시 항목이 출력되도록 작성해주세요. 결과는 진료예약일시를 기준으로 오름차순 정렬해주세요.


예시

 

PATIENT 테이블이 다음과 같고,

PT_NO PT_NAME GEND_CD AGE TLNO
PT22000019 바라 W 10 01079068799
PT22000043 오스왈드 M 68 01031294124
PT22000052 제니 W 60 NULL
PT22000071 몬몬 M 31 01076489209
PT22000097 슈가 M 19 NULL

DOCTOR 테이블이 다음과 같고,

DR_NAME DR_ID LCNS_NO HIRE_YMD MCDP_CD TLNO
루피 DR20090029 LC00010001 2009-03-01 CS 01085482011
니모 DR20200012 LC00911162 2020-03-01 CS 01089483921
핑크퐁 DR20140011 LC00082201 2014-03-01 NP 01098428957
젤라비 DR20160031 LC00340327 2016-11-01 OB 01023981922
토리 DR20190129 LC00099911 2019-03-01 NS 01058390758

APPOINTMENT 테이블이 다음과 같을 때,

APNT_YMD APNT_NO PT_NO MCDP_CD MDDR_ID APNT_CNCL_YN APNT_CNCL_YMD
2022-04-13 12:30:00.000000 42 PT22000071 CS DR20090029 N NULL
2022-04-13 15:30:00.000000 43 PT22000019 CS DR20200012 N NULL
2022-04-13 09:00:00.000000 46 PT22000043 CS DR20090029 N NULL
2022-07-09 11:00:00.000000 74 PT22000042 NP DR20100011 N NULL
2022-12-13 12:30:00.000000 110 PT22000097 NP DR20160011 Y 2022-12-03

SQL을 실행하면 다음과 같이 출력되어야 합니다.

APNT_NO PT_NAME PT_NO MCDP_CD DR_NAME APNT_YMD
46 오스왈드 PT22000043 CS 루피 2022-04-13 09:00:00.000000
42 몬몬 PT22000071 CS 루피 2022-04-13 12:30:00.000000
42 바라 PT22000001 CS 니모 2022-04-13 15:30:00.000000

 

 

정답 

SELECT A.APNT_NO,B.PT_NAME,A.PT_NO,A.MCDP_CD,C.DR_NAME,A.APNT_YMD FROM APPOINTMENT AS A
INNER JOIN PATIENT AS B
ON A.PT_NO=B.PT_NO
INNER JOIN DOCTOR AS C
ON C.DR_ID=A.MDDR_ID
WHERE APNT_YMD LIKE '%2022-04-13%' AND A.APNT_CNCL_YN = 'N' AND A.MCDP_CD = 'CS'
GROUP BY A.APNT_YMD
ORDER BY A.APNT_YMD

주어진 테이블이 3개나 되는 문제이다. 따라서 3개의 테이블을 JOIN해야하는 문제인데 방법은 의외로 간단하다. 

우선 A와 B로 지정한 테이블을 JOIN한 다음 이 테이블에 연속으로 C도 JOIN하는 것이다. 이 때 각 JOIN을 할 때 ON을 사용해야 하는것은 기존 방법과 같고, 그 이후론 이전에 풀던 문제들과 형식이 비슷하다. 

 

 

 

이 문제는 LEFT, INNER 둘 다 정답인 경우이기는 하나, 3개 이상 테이블을 JOIN할 땐 주의해야한다.

 

 

LEFT JOIN을 여러번 할 때 주의할 점

  • 가장 첫 번째의 테이블로 SELECT문에 가장 많은 열을 가져와야 할 테이블을 우선으로 작성해야 한다.
  • 시작이 LEFT JOIN이면 그 이후론 다른 JOIN을 사용을 피해야 한다.

위의 주의사항들이 필수적인 요소는 아니지만 원하는 결과 테이블의 구성이 달라질 수 있기도 한다.

 

 

 

'SQL' 카테고리의 다른 글

UNION 응용  (0) 2023.01.07
서브쿼리 응용(3)  (1) 2023.01.06
년, 월, 성별 별로 상품을 구매한 회원수 구하기 문제  (0) 2023.01.04
WHERE 논리 연산자 응용  (0) 2023.01.03
GROUP_CONCAT 응용  (0) 2023.01.02