Oracle(12c 이상)에서 운임 2~3위 예약(동점 없음)을 조회하… | [SQLD] SQL 개발자 기출유형 모의고사 4회 상세 페이지

1[SQLD] SQL 개발자 기출유형 모의고사 4회
Oracle(12c 이상)에서 운임 2~3위 예약(동점 없음)을 조회하려 한다. 의도한 결과를 얻지 못하는 SQL 은?

[예약]

예약번호운임
1300
2520
3180
4450
5610

㉠

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을 고른다.

오류나 개정된 내용이 보이면 알려주세요

이어서 풀어보기

[SQLD] SQL 개발자 기출유형 모의고사 4회 50문항 이어서 보기문제·정답·해설을 한 페이지에서 이어서 볼 수 있어요SQLD SQL 개발자 실전 모의고사 암기장 전체 보기