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 |