programing

Oracle 페이징을 위한 LIMIT 및 OFFSET 대체 방법

css3 2023. 4. 5. 22:06

Oracle 페이징을 위한 LIMIT 및 OFFSET 대체 방법

웹 어플리케이션을 개발 중인데 주문된 결과를 페이지화해야 합니다.저는 보통 LIMIT/OFFSET을 사용하고 있습니다.

Oracle에서 주문된 결과를 페이지화하는 가장 좋은 방법은 무엇입니까?로넘과 서브쿼리를 사용한 샘플을 본 적이 있습니다.그게 방법인가요?이 SQL을 Oracle로 변환하기 위한 샘플을 주시겠습니까?

SELECT fieldA,fieldB 
FROM table 
ORDER BY fieldA 
OFFSET 5 LIMIT 14

(Oracle 10g을 사용하고 있습니다.)

감사합니다!


답변: 이 SQL은 carim79에서 제공하는 링크를 사용하여 다음과 같습니다.

SELECT * FROM (
    SELECT rownum rnum, a.* 
    FROM(
        SELECT fieldA,fieldB 
        FROM table 
        ORDER BY fieldA 
    ) a 
    WHERE rownum <=5+14
)
WHERE rnum >=5

Oracle 12c부터는 상위 N개의 쿼리를 사용할 수 있습니다.

SELECT fieldA,fieldB 
FROM table 
ORDER BY fieldA 
OFFSET 5 ROWS FETCH NEXT 14 ROWS ONLY;

http://www.oracle-base.com/articles/12c/row-limiting-clause-for-top-n-queries-12cr1.php

10g이므로 분석 기능을 사용하여 ROWNUM 접근 방식을 단순화할 수 있습니다.

SELECT fieldA, 
       fieldB
  FROM (SELECT fieldA,
               fieldB,
               row_number() over (order by fieldA) rnk
          FROM table_name)
 WHERE rnk BETWEEN 5 AND 14;

를 사용해야 합니다.rownumpseudocolumn을 지정하여 결과를 제한합니다.여기를 참조해 주세요.

http://www.oracle.com/technology/oramag/oracle/06-sep/o56asktom.html

http://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html

방법 1: 데이터베이스 버전 Oracle 12c 이상일 경우

SELECT fieldA, fieldB 
FROM table 
ORDER BY fieldA 
OFFSET 5 ROWS FETCH NEXT 14 ROWS ONLY

방법-2: 분석함수 RowNumber()를 사용한 데이터베이스 버전 Oracle11g 이하

SELECT fieldA, fieldB
FROM (
    SELECT fieldA, fieldB,
        row_number() over (order by fieldA) rowRank
    FROM table_name
)
WHERE rowRank BETWEEN 5 AND 14;

방법 3: RowNum을 사용하는 데이터베이스 버전 Oracle11g 이하인 경우

SELECT T.* FROM ( 
SELECT T.*, rowNum as rowIndex
FROM (
    SELECT fieldA, fieldB,
    FROM table_name
)T)T
WHERE rowIndex > 0 AND rowIndex <= 20;

경우에 따라서는 method-2보다 method-3이 빠르다는 것을 알게 되었습니다.method-2에서는 절에 의한 순서가 필수이기 때문입니다.단, 데이터베이스 버전이 12c 이상일 경우 method-1을 사용해야 합니다.

언급URL : https://stackoverflow.com/questions/2912144/alternatives-to-limit-and-offset-for-paging-in-oracle