본문 바로가기
🖥️/DBMS

[Oracle 문법] order by ~ limit 구현하기

by HanaV 2023. 6. 28.
728x90

 

구현하고 싶은 것: finished_rate가 가장 높은 행의 정보 전체를 가져오기

원하는 결과: finish_rate=1인 행의 전체 정보

 

oracle은 limit이 없어서 다음과 같이 적어야한다고 한다.

SELECT a.*
  FROM (SELECT b.*,
               rownum b_rownum
          FROM (SELECT c.*
                  FROM some_table c
                 ORDER BY some_column) b
         WHERE rownum <= <<upper limit>>) a
 WHERE b_rownum >= <<lower limit>>

만약 upper limit과 lower limit이 존재하는 경우, 그리고 정렬된 rownum 칼럼이 필요한 경우라면 위와 같이 길게 써야하겠지만, 나같은 경우는 upper limit만 있으면 므로 더 간단하게 나타낼 수 있다.

 

1. finished_rate가 큰 순으로 정렬하기

 SELECT * FROM tbl_class ORDER BY finished_rate desc

 

2. 정렬되면서 rownum도 새로 정렬되었는데, 확실히 하기 위해서 다시 확인

SELECT rownum, class_code FROM (SELECT * FROM tbl_class ORDER BY finished_rate desc)

 

3. 새로 정렬된 rownum대로 정보 전부 가져오기

SELECT * FROM (SELECT * FROM tbl_class ORDER BY finished_rate desc)

 

4. 그 중 가장 높은 1개, 즉 rownum<=1인 것만 출력

SELECT * FROM (SELECT * FROM tbl_class ORDER BY finished_rate desc) WHERE rownum <= 1

 

만약 이전 rownum값과 새로운 rownum 값도 불러올 필요가 있다면, 다음과 같이 불러올 수 있다.

SELECT a.*, rownum new_rownum FROM (SELECT b.*, rownum old_rownum
                  FROM tbl_class b
                 ORDER BY finished_rate desc) a

728x90

"); wcs_do();