>데이터 베이스 >MySQL 튜토리얼 >Oracle에서 쿼리 결과를 효율적으로 제한하고 오프셋하는 방법은 무엇입니까?

Oracle에서 쿼리 결과를 효율적으로 제한하고 오프셋하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-01-25 08:52:11858검색

How to Efficiently Limit and Offset Query Results in Oracle?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.