Limite de consulta SQL para o DB2 AS / 400 Versão 4

9

Eu sei que a versão é muito antiga (sim, versão 4!), mas não tenho escolha.

Como limitar minha consulta por exemplo apenas 100 linhas para o DB2 AS400?

FETCH FIRST n ROWS ONLY

e

ROW_NUMBER()

não funciona.

Alguma ideia ou solução alternativa?

Aqui está uma consulta SQL de amostra (não funciona):

SELECT POLNOP FROM ZICACPTF.POLHDR FETCH FIRST 10 ROWS ONLY

Diz

  

[SQL0199] Palavra-chave FETCH não esperado. Tokens válidos: PARA COM O UNDER ORDER OPTIMIZE.

    
por Kevin 10.04.2015 в 07:44
fonte

2 respostas

2

Não há suporte a dbms para esta operação, verifique Versão 4 do DB2 UDB para AS / 400 SQL Reference : Sem Limit , Top , First , ... palavras reservadas.

Você pode tentar limitar linhas por meio da cláusula where, where sequence between 100 and 200 . Mas este é um cenário irreal.

O primeiro trabalho é via cursor :

DECLARE ITERROWS INTEGER;
...
SET ITERROWS = 0;
DO WHILE (SUBSTR(SQLSTATE,1,2) = '00' and ITERROWS < 100
DO
    ...
    SET ITERROWS = ITERROWS + 1;

segundo, na sua linguagem de middleware .

Espero que alguém poste uma solução inteligente, mas, na minha opinião, não são.

    
por dani herrera 19.04.2015 / 19:09
fonte
0

Solução apenas para > V4R4

Usando FETCH FIRST [n] ROWS ONLY :

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

Referência: publib.boulder.ibm.com

A diferença que vejo da sua consulta para este exemplo é que aqui estamos usando uma cláusula ORDER BY - você tem a possibilidade de adicionar um ORDER BY ? ele deve fazer o truque. Fazendo referência a: link

Para obter intervalos ou também apenas as primeiras 10 linhas, você teria que usar ROW_NUMBER() (desde v5r4):

SELECT 
    * 
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY {{table field}}) AS ROWNUM, * {{yourtable}}
) AS {{yourcursor}}
WHERE 
    {{yourcursor}}.ROWNUM>0 AND 
    {{yourcursor}}.ROWNUM<=10

Referência: blog.zanclus.com

    
por DominikAngerer 18.04.2015 / 18:39
fonte