집 >데이터 베이스 >MySQL 튜토리얼 >Oracle에서 쿼리 결과를 효율적으로 제한하고 오프셋하는 방법은 무엇입니까?
결과 집합 제한에 자주 사용되는 Oracle의 ROWNUM
의사 열은 주문과 결합할 때 독특한 문제를 제시합니다. 정렬 후에 적용되는 MySQL의 LIMIT
절과 달리 ROWNUM
절이 처리되기 전 필터가 ORDER BY
처리됩니다. 즉, 단순히 ROWNUM
을 사용한다고 해서 결과의 특정 순서 하위 집합이 보장되지는 않습니다.
표준 접근 방식(모든 Oracle 버전):
MySQL의 LIMIT
기능과 동등한 기능을 얻으려면 중첩 쿼리를 사용하세요.
<code class="language-sql">SELECT * FROM ( SELECT * FROM emp ORDER BY sal DESC ) WHERE ROWNUM <= 5;</code>
이 접근 방식은 먼저 데이터를 정렬한 다음 ROWNUM
필터를 적용하여 상위 5개의 최고 급여가 반환되도록 합니다.
결과 상쇄 및 제한:
보다 정교한 제어를 위해 오프셋과 한계를 모두 지정하려면 약간 더 복잡한 쿼리가 필요합니다.
<code class="language-sql">SELECT * FROM ( SELECT a.*, ROWNUM rnum FROM ( SELECT * -- Your main query with ORDER BY clause FROM some_table ORDER BY some_column ) a WHERE ROWNUM <= :MAX_ROW_TO_FETCH ) WHERE rnum >= :MIN_ROW_TO_FETCH;</code>
:MAX_ROW_TO_FETCH
및 :MIN_ROW_TO_FETCH
를 원하는 상한 및 하한으로 바꿉니다. 주문 후 특정 범위 내의 행을 가져옵니다.
Oracle 12c 이상: FETCH
절:
Oracle 12c(및 이후 버전)는 FETCH
절을 사용하여 더욱 우아한 솔루션을 제공합니다.
<code class="language-sql">-- Retrieve the first 10 rows SELECT * FROM sometable ORDER BY name FETCH FIRST 10 ROWS ONLY; -- Retrieve rows 20-30 SELECT * FROM sometable ORDER BY name OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;</code>
FETCH
절은 결과를 제한하고 상쇄하는 더 깔끔하고 읽기 쉬운 방법을 제공하므로 Oracle 12c 이상에서 선호되는 방법입니다. 이전 버전의 경우 중첩 쿼리 접근 방식이 여전히 필요합니다.
위 내용은 Oracle에서 쿼리 결과를 효율적으로 제한하고 오프셋하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!