[db2] DB2의 LIMIT에 해당

LIMITiSeries 용 DB2에서 어떻게합니까 ?

50,000 개가 넘는 레코드가있는 테이블이 있는데 0에서 10,000까지 레코드를 반환하고 10,000에서 20,000까지 레코드를 반환하려고합니다.

나는 SQL LIMIT 0,10000에서 쿼리 끝에 0에서 10,000 LIMIT 10000,10000까지 작성하고 쿼리 끝에 10000에서 20,000 까지 작성 한다는 것을 알고 있습니다.

그렇다면 이것은 DB2에서 어떻게 수행됩니까? 코드와 구문은 무엇입니까? (전체 쿼리 예를 들어 주셔서 감사합니다)



답변

사용 FETCH FIRST [n] ROWS ONLY:

http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=/com.ibm.db29.doc.perf/db2z_fetchfirstnrows.htm

SELECT LASTNAME, FIRSTNAME, EMPNO, SALARY
  FROM EMP
  ORDER BY SALARY DESC
  FETCH FIRST 20 ROWS ONLY;

범위를 얻으려면 ROW_NUMBER()(v5r4부터) 사용하고 다음 WHERE절 내에서 사용해야합니다 . (여기에서 도난 당함 : http://www.justskins.com/forums/db2-select-how-to-123209.html )

SELECT code, name, address
FROM (
  SELECT row_number() OVER ( ORDER BY code ) AS rid, code, name, address
  FROM contacts
  WHERE name LIKE '%Bob%'
  ) AS t
WHERE t.rid BETWEEN 20 AND 25;


답변

이 방법을 개발했습니다.

주문할 수있는 고유 한 값이있는 테이블이 필요합니다.

10,000 ~ 25,000 행을 원하고 테이블에 40,000 행이있는 경우 먼저 시작점과 총 행을 가져와야합니다.

int start = 40000 - 10000;

int total = 25000 - 10000;

그런 다음 코드로 쿼리에 전달합니다.

SELECT * FROM
(SELECT * FROM schema.mytable
ORDER BY userId DESC fetch first {start} rows only ) AS mini
ORDER BY mini.userId ASC fetch first {total} rows only


답변

OFFSET 및 LIMIT에 대한 지원이 최근 i 용 DB2 7.1 및 7.2에 추가되었습니다. 이 지원을 받으려면 다음 DB PTF 그룹 레벨이 필요합니다.

  • IBM i 7.2 용 SF99702 레벨 9
  • IBM i 7.1 용 SF99701 레벨 38

자세한 정보는 여기를 참조하십시오. OFFSET 및 LIMIT 문서 , i 용 DB2 Enhancement Wiki


답변

내가 생각해 낸 해결책은 다음과 같습니다.

select FIELD from TABLE where FIELD > LASTVAL order by FIELD fetch first N rows only;

LASTVAL을 0 (또는 텍스트 필드의 경우 ”)으로 초기화 한 다음 가장 최근 레코드 집합의 마지막 값으로 설정하면 N 개 레코드 청크로 테이블을 단계별로 진행합니다.


답변

@elcool의 솔루션 은 현명한 아이디어이지만 총 행 수를 알아야합니다 (쿼리를 실행하는 동안 변경 될 수도 있습니다!). 그래서 수정 된 버전을 제안합니다. 불행히도 2 대신 3 개의 하위 쿼리가 필요합니다.

select * from (
    select * from (
        select * from MYLIB.MYTABLE
        order by MYID asc
        fetch first {last} rows only
        ) I
    order by MYID desc
    fetch first {length} rows only
    ) II
order by MYID asc

어디에서 {last}내가 필요한 마지막 레코드의 행 번호 {length}로 대체되어야하며 필요한 행 수로 대체되어야합니다.last row - first row + 1 .

예를 들어 10에서 25 행 (완전히 16 행)을 원하면 {last}25 {length}가되고 25-10 + 1 = 16이됩니다.


답변

OPTIMIZE FOR n ROWS 절도 고려해야합니다. 이에 대한 자세한 내용은 SELECT 문 제한 지침 주제 의 DB2 LUW 문서에 있습니다 .

  • OPTIMIZE FOR 절은 결과의 서브 세트 만 검색하거나 처음 몇 행만 검색하는 데 우선 순위를 부여하려는 의도를 선언합니다. 그러면 옵티마이 저는 처음 몇 행을 검색하기위한 응답 시간을 최소화하는 액세스 플랜을 선택할 수 있습니다.


답변

이 시도

SELECT * FROM
    (
        SELECT T.*, ROW_NUMBER() OVER() R FROM TABLE T
    )
    WHERE R BETWEEN 10000 AND 20000