💯 Coding Test

[프로그래머스] 취소되지 않은 진료 예약 조회하기

date
Jul 3, 2023
slug
programmers132204
author
status
Public
tags
SQL
summary
String, Date
type
Post
thumbnail
updatedAt
Jul 5, 2023 01:57 AM
category
💯 Coding Test

[문제 링크]

[풀이 코드]

우선 테이블이 3개…
# 각 테이블의 기본키 확인법 DESC 테이블명;
PATIENT
PATIENT
DOCTOR
DOCTOR
APPOINTMENT
APPOINTMENT
DOCTOR 테이블에서는 DR_NAME만 필요해서 스칼라 서브쿼리를 사용해 가져오려고 했음
# 오답 SELECT A.APNT_NO, P.PT_NAME, P.PT_NO, A.MCDP_CD, ( SELECT DR_NAME FROM DOCTOR D WHERE D.DR_ID = A.MDDR_ID) AS DR_NAME, A.APNT_YMD FROM PATIENT P JOIN APPOINTMENT A ON P.PT_NO = A.PT_NO WHERE A.MCDP_CD = 'CS' AND A.APNT_YMD LIKE '2022-04-13%' ORDER BY A.APNT_YMD
notion image
notion image
# 정답 SELECT A.APNT_NO, P.PT_NAME, P.PT_NO, A.MCDP_CD, D.DR_NAME, A.APNT_YMD FROM PATIENT P JOIN APPOINTMENT A ON P.PT_NO = A.PT_NO JOIN DOCTOR D ON A.MDDR_ID = D.DR_ID WHERE A.MCDP_CD = 'CS' AND A.APNT_YMD LIKE '2022-04-13%' AND A.APNT_CNCL_YN = 'N' ORDER BY A.APNT_YMD
notion image
notion image
 
출력 결과는 같다. 다른 데이터로 하면 결과가 다를 수도 있겠다..
이 데이터에서는 2022-04-13 데이터가 하나 밖에 없어서 실수를 찾기가 쉽지 않았다.
뭔가… 저번에 풀었던 문제와 비슷한 실수인 것 같았다.
notion image
이 부분에서 아마 CS와 날짜 선택이 되지 않아서 틀린 것 같다.
 
이 문제에서 서브쿼리를 사용하려면 스칼라 서브쿼리가 아니라 인라인뷰를 사용해야 한다.
PATIENT와 APPOINTMENT를 조인한 테이블을 C로 지칭하고 DOCTOR 테이블을 D로 지칭
SELECT APNT_NO, PT_NAME, PT_NO, C.MCDP_CD, DR_NAME, APNT_YMD FROM DOCTOR D, (SELECT A.APNT_NO, P.PT_NAME, P.PT_NO, A.MCDP_CD, A.MDDR_ID, A.APNT_YMD FROM PATIENT P JOIN APPOINTMENT A ON P.PT_NO = A.PT_NO WHERE A.MCDP_CD = 'CS' AND A.APNT_YMD LIKE '2022-04-13%' AND A.APNT_CNCL_YN = 'N') C WHERE D.DR_ID = C.MDDR_ID ORDER BY A.APNT_YMD
SELECTC.MCDP_CD 부분만 C.으로 지칭한 이유는 DOCTOR에도 MCDP_CD가 존재하기 때문에
DOCTORMCDP_CD인지 C테이블의 MCDP_CD인지 명확히 하기 위함이다.
다른 컬럼들은 겹치는 컬럼이 없었으므로 그대로 적어도 무관하다.
 
 

서브쿼리

  • SELECT절 스칼라 서브쿼리 : 하나의 컬럼처럼
  • FROM절 인라인 뷰: 하나의 테이블처럼
  • WHERE절 일반 서브쿼리: 하나의 변수처럼