복붙노트

[SQL] LIMIT 대안과 오라클에서 페이징 오프셋 [중복]

SQL

LIMIT 대안과 오라클에서 페이징 오프셋 [중복]

나는 페이지 주문 결과에 웹 응용 프로그램과 필요를 개발하고 있어요. 나는 일반적으로이 목적을 위해 오프셋 LIMIT를 / 사용합니다.

오라클 페이지 주문 결과 가장 좋은 방법은 무엇입니까? 나는 ROWNUM과 하위 쿼리를 사용하여 일부 샘플을 본 적이있다. 즉, 방법이 있나요? 당신은 오라클이 SQL을 번역 나에게 샘플을 제공 할 수 :

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

(나는 무엇의 가치를 위해, 오라클 10g를 사용하고 있습니다)

감사!

대답: karim79 아래 제공된 링크를 사용하면,이 SQL과 같을 것이다 :

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

해결법

  1. ==============================

    1.당신은 한계 결과에 ROWNUM 의사 열을 사용해야합니다. 여기를 봐:

    당신은 한계 결과에 ROWNUM 의사 열을 사용해야합니다. 여기를 봐:

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

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

  2. ==============================

    2.당신이 10g에있어 때문에, 당신은 분석 기능을 사용하여 ROWNUM 접근 방식을 단순화 할 수 있어야한다

    당신이 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;
    
  3. ==============================

    3.오라클 (12c)의, 당신은 상단의 N 쿼리를 사용할 수 있습니다.

    오라클 (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

  4. ==============================

    4.방법 1 : 데이터베이스 버전 Oracle12c 이상 들어

    방법 1 : 데이터베이스 버전 Oracle12c 이상 들어

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

    데이터베이스 버전 Oracle11g 필요하거나 분석 기능 ROWNUMBER를 사용하여 낮은 () : 방법 - 2

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

    데이터베이스 버전 Oracle11g에 대한 또는 ROWNUM을 사용하여 낮은 : 방법 - 3

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

    어떤 경우에는, 당신의 데이터베이스 버전은 12C 인 이상 당신이 방법-1에 대한 이동해야하는 경우 방법-3, ORDER BY 절은 그러나 방법 2에 필수이기 때문에 빠른 방법-2보다 발견했다.

  5. from https://stackoverflow.com/questions/2912144/alternatives-to-limit-and-offset-for-paging-in-oracle by cc-by-sa and MIT license