Oracle(12c 이상)에서 운임 2~3위 예약(동점 없음)을 조회하… | [SQLD] SQL 개발자 기출유형 모의고사 4회 상세 페이지
1[SQLD] SQL 개발자 기출유형 모의고사 4회
Oracle(12c 이상)에서 운임 2~3위 예약(동점 없음)을 조회하려 한다. 의도한 결과를 얻지 못하는 SQL 은?[예약]
| 예약번호 | 운임 |
|---|---|
| 1 | 300 |
| 2 | 520 |
| 3 | 180 |
| 4 | 450 |
| 5 | 610 |
㉠
SELECT * FROM (SELECT ROWNUM AS RN, A.*
FROM (SELECT * FROM 예약 ORDER BY 운임 DESC) A)
WHERE RN BETWEEN 2 AND 3;㉡
SELECT * FROM (SELECT * FROM 예약 ORDER BY 운임 DESC) WHERE ROWNUM BETWEEN 2 AND 3;
㉢
SELECT * FROM 예약 ORDER BY 운임 DESC OFFSET 1 ROWS FETCH NEXT 2 ROWS ONLY;
㉣
SELECT 예약번호, 운임
FROM (SELECT 예약번호, 운임,
ROW_NUMBER() OVER (ORDER BY 운임 DESC) AS RN
FROM 예약)
WHERE RN BETWEEN 2 AND 3;1
㉢
2
㉣
3
㉠
4
㉡
해설
㉡은 ROWNUM 을 바로 조건에 썼는데, ROWNUM 은 조건을 통과한 행에만 1부터 붙으므로 첫 행이 ROWNUM 1을 받고 탈락하면 다음 행도 다시 1을 받아 결과가 0행이다.
2~3위처럼 중간 구간을 자르려면 ㉠처럼 ROWNUM 에 별칭을 붙여 한 단계 바깥에서 비교해야 한다.
- ㉠은 정렬된 인라인 뷰에 RN 을 확정한 뒤 걸러 520·450 두 행을 얻는다.
- ㉢은 12c 의 OFFSET·FETCH 로 첫 행을 건너뛰고 두 행을 가져온다.
- ㉣은 ROW_NUMBER 로 순번을 매긴 뒤 바깥에서 순번 2~3을 고른다.
오류나 개정된 내용이 보이면 알려주세요