진료비 상위 환자를 조회하려는 다음 SQL 중 실행 시 오류가 발생하는… | [SQLD] SQL 개발자 기출유형 모의고사 6회 상세 페이지
1[SQLD] SQL 개발자 기출유형 모의고사 6회
진료비 상위 환자를 조회하려는 다음 SQL 중 실행 시 오류가 발생하는 것은?[진료]
| 진료번호 | 과코드 | 환자명 | 진료비 |
|---|---|---|---|
| 1 | K1 | 강민 | 30000 |
| 2 | K1 | 오라 | 52000 |
| 3 | K2 | 하율 | 18000 |
| 4 | K2 | 표지안 | 41000 |
㉠
SELECT 환자명, 진료비
FROM (SELECT 환자명, 진료비,
ROW_NUMBER() OVER (ORDER BY 진료비 DESC) AS RN
FROM 진료) V
WHERE RN <= 3;㉡
SELECT 환자명, 진료비,
ROW_NUMBER() OVER (ORDER BY 진료비 DESC) AS RN
FROM 진료
WHERE RN <= 3;㉢
SELECT 환자명, 진료비 FROM 진료 ORDER BY 진료비 DESC FETCH FIRST 3 ROWS ONLY;
㉣
SELECT 과코드, 환자명
FROM (SELECT 과코드, 환자명,
ROW_NUMBER() OVER (PARTITION BY 과코드
ORDER BY 진료비 DESC) AS RN
FROM 진료) V
WHERE RN = 1;1
㉣
2
㉢
3
㉡
4
㉠
해설
WHERE 절은 SELECT 절보다 먼저 처리되므로 SELECT 에서 만든 윈도우 함수 별칭 RN 을 같은 쿼리의 WHERE 에서 참조하면 오류가 난다.
순번으로 거르려면 순번을 매긴 쿼리를 인라인 뷰로 감싼 뒤 바깥 WHERE 에서 RN 을 비교해야 한다.
- ㉠은 인라인 뷰에서 순번을 만든 뒤 바깥에서 거르는 올바른 방식이다.
- ㉢은 정렬 후 3행만 가져오는 표준 FETCH FIRST 구문이다.
- ㉣은 과코드별로 순번을 매겨 과마다 최고 진료비 환자를 구한다.
오류나 개정된 내용이 보이면 알려주세요