Oracle ROWNUM 및 페이지 매김: 일반적인 문제 및 해결 방법
이 문서에서는 Oracle SQL에서 페이지 매김을 위해 ROWNUM
을 사용할 때 자주 발생하는 문제에 대해 설명합니다.
문제 1: WHERE
ROWNUM
을 사용한 비효과적인
SELECT * FROM Person WHERE rownum > 100
가 결과를 반환하지 않는 이유는 무엇입니까?
ROWNUM
은 초기 필터링(조건자) 단계 이후에 할당됩니다. ROWNUM
값은 할당 후에만 증가하므로 이러한 방식으로 WHERE
절을 사용하여 1보다 큰 값을 직접 선택할 수 없습니다. ROWNUM > 100
.
문제 2: ROWNUM BETWEEN
제한사항
WHERE rownum BETWEEN lowerBound AND upperBound
이 페이지네이션에 적합하지 않은 이유는 무엇인가요?
이 구문은 ROWNUM
할당이 WHERE
절 평가보다 우선하므로 효과적이지 않습니다. Oracle은 ROWNUM
값
솔루션: Oracle 12c 이상(상위 n 행 제한)
Oracle 12c에서는 OFFSET
및 FETCH
을 사용하는 "상위 n 행 제한"이라는 뛰어난 접근 방식을 도입했습니다. 예:
<code class="language-sql">SELECT empno, sal FROM emp ORDER BY sal OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY;</code>
이렇게 하면 행 5-8(오프셋 4, 페치 4)이 효율적으로 검색됩니다. 이 방법은 ROWNUM
에만 의존하는 기술보다 선호됩니다.
문제 3: ROWNUM
열 숨기기
결과 세트에 ROWNUM
열이 표시되지 않도록 하려면 어떻게 해야 하나요?
외부 SELECT
문에 원하는 열만 나열하면 됩니다. 또는 SQL*Plus에서 NOPRINT
명령을 사용하여 특정 열의 출력을 억제할 수 있습니다.
문제 4: ROWNUM
(이전 Oracle 버전)으로 올바른 페이지 매김 보장
ROWNUM
올바른 페이지 매김을 달성할 수 있나요?
예, 하지만 중첩된 쿼리 구조가 필요합니다.
<code class="language-sql">SELECT val FROM (SELECT val, rownum AS rnum FROM (SELECT val FROM t ORDER BY val) WHERE rownum <= 8) WHERE rnum >= 5;</code>
이렇게 하면 행 5-8이 올바르게 검색됩니다. 내부 쿼리는 ROWNUM
을 할당하고, 중간 쿼리는 상한을 기준으로, 외부 쿼리는 하한을 기준으로 필터를 할당합니다. 그러나 Oracle 12c 이상에서는 OFFSET
/FETCH
메서드가 더 효율적이고 읽기 쉬운 옵션으로 남아 있습니다.
위 내용은 Oracle의 ROWNUM: 적절한 페이지 매김을 달성하고 일반적인 함정을 피하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!