Equivalente-limite para o DB2

como se faz {[[0]} em DB2 para iSeries?

Tenho uma mesa com mais de 50 mil registos e quero devolver os registos de 0 a 10 mil, e registos de 10 mil a 20 mil.

Eu sei que em SQL você escreve {[1] } no final da consulta de 0 a 10,000 e LIMIT 10000,10000 no final da consulta de 10000 a 20,000

Então, como é que isto é feito em DB2? Qual é o código e a sintaxe? (o exemplo de pesquisa completa é apreciado)

Author: elcool, 2010-10-07

9 answers

Utilizar 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;

Para obter intervalos, você teria que usar ROW_NUMBER() (desde v5r4) e o uso que dentro do WHERE cláusula: (roubado daqui: 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;
 130
Author: Joe, 2012-06-05 08:24:31

Desenvolveu este método:

Você precisa de uma tabela que tem um valor único que pode ser encomendado.

Se quiser as linhas 10. 000 a 25. 000 e a sua mesa tiver 40. 000 linhas, primeiro terá de obter o ponto de partida e o total das linhas:

int start = 40000 - 10000;

int total = 25000 - 10000;

E depois passar estes por código para a consulta:

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
 12
Author: elcool, 2010-10-07 20:06:51

O apoio ao OFFSET e ao LIMIT foi recentemente acrescentado ao DB2 para os pontos i 7.1 e 7.2. Você precisa dos seguintes níveis de Grupo DB PTF para obter este suporte:

  • SF99702 Nível 9 para a IBM i 7.2
  • SF99701 Nível 38 para a IBM i 7.1

Ver aqui para mais informações: OFFSET e LIMIT documentação , DB2 para I Enhancement Wiki

 8
Author: Kevin Adler, 2016-02-04 22:23:56
Eis a solução que encontrei:
select FIELD from TABLE where FIELD > LASTVAL order by FIELD fetch first N rows only;

Inicializando o LASTVAL para 0 (ou " para um campo de texto), depois definindo-o para o último valor no conjunto de registos mais recente, isto irá passar pela tabela em pedaços de registos N.

 5
Author: Tom Barron, 2014-02-11 19:18:24

@a solução de elcool é uma ideia inteligente, mas você precisa saber o número total de linhas (que podem até mudar enquanto você está executando a consulta!). Por isso, proponho uma versão modificada, que infelizmente precisa de 3 subquases em vez de 2:

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

Em que {last} deve ser substituído pelo número da linha do último registo de que preciso e {[[2]} deve ser substituído pelo número de linhas de que preciso, calculado como last row - first row + 1.

Por exemplo, se eu quiser linhas de 10 a 25 (totalmente 16 linhas), {last} será 25 e {[2] } serão 25-10+1 = 16.

 2
Author: bluish, 2017-05-23 10:31:16

Também deve considerar a cláusula de optimização para as linhas n. Mais detalhes sobre tudo isso na documentação do DB2 LUW no Guidelines for restricting SELECT statements topic:

  • a cláusula OPTIMIZE FOR declara a intenção de obter apenas um subconjunto do resultado ou de dar prioridade a recuperar apenas as primeiras linhas. O otimizador pode então escolher planos de acesso que minimizem o tempo de resposta para recuperar as primeiras linhas.
 0
Author: David Sky, 2010-10-08 15:26:37

Existem 2 soluções para paginar de forma eficiente numa tabela DB2:

1-a técnica que utiliza a função row_number () e a cláusula sobre a qual foi apresentada noutra publicação ("seleccione row_number () sobre (ordem por ... )"). Em algumas mesas grandes, eu notei às vezes uma degradação de performances.

2-a técnica usando um cursor desenrolável. A implementação depende da linguagem utilizada. Essa técnica parece mais robusta em mesas grandes.

Técnicas implementadas em PHP durante um seminário no próximo ano. O 'slide' está disponível nesta ligação : http://gregphplab.com/serendipity/uploads/slides/DB2_PHP_Best_practices.pdf

Desculpe, mas este documento só está em francês.
 0
Author: gregphplab, 2013-03-05 11:04:42

Existem estas opções disponíveis: -

DB2 has several strategies to cope with this problem.
You can use the "scrollable cursor" in feature.
In this case you can open a cursor and, instead of re-issuing a query you can FETCH forward and backward.
This works great if your application can hold state since it doesn't require DB2 to rerun the query every time.
You can use the ROW_NUMBER() OLAP function to number rows and then return the subset you want.
This is ANSI SQL 
You can use the ROWNUM pseudo columns which does the same as ROW_NUMBER() but is suitable if you have Oracle skills.
You can use LIMIT and OFFSET if you are more leaning to a mySQL or PostgreSQL dialect.  
 0
Author: Hector, 2017-08-03 11:53:50

Tenta isto

SELECT * FROM
    (
        SELECT T.*, ROW_NUMBER() OVER() R FROM TABLE T
    )
    WHERE R BETWEEN 10000 AND 20000
 0
Author: Lucio Menci, 2017-10-19 15:18:06