Contornando problemas com LIMIT e OFFSET no DB2

Quem esta acostumado a utilizar em suas SQL Queries os comandos LIMIT e OFFSET, vai ter dificuldades na hora de trabalhar com o IBM DB2, pois ele (por padrão) não aceita esses comandos.

LIMIT e OFFSET permitem trazer apenas uma parte das linhas geradas pela consulta, sendo que são muito utilizados para montar scripts de paginação.

SELECT <var>lista_seleção</var>
    FROM <var>expressão_tabela</var>
    [LIMIT { <var>número</var> | ALL }] [OFFSET <var>número</var>]

Quando o limite é fornecido, não mais que esta quantidade de linhas será retornada (mas possivelmente menos, se a consulta produzir menos linhas). LIMIT ALL é o mesmo que omitir a cláusula LIMIT.

OFFSET informa para saltar uma quantidade de linhas antes de começar a retornar as linhas para o cliente. OFFSET 0 é o mesmo que omitir a cláusula OFFSET. Se tanto OFFSET quando LIMIT forem especificados, então são saltadas OFFSET linhas antes de começar a contar as LIMIT linhas que serão retornadas.

Agora que conhecemos os comandos, e o que fazem, vamos para a utilização no IBM DB2, com a solução de contorno:

Para apenas limitar a quantidade de linhas que a consulta irá resultar, podemos utilizar o comando FETCH FIRST n ROWS ONLY.
Exemplo: 

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

Nesse exemplo teremos as 20 primeiras linhas que a query retornar (limita em apenas 20 linhas o resultado). Isso soluciona o problema da utilização do LIMIT n.

Agora para o caso de utilizar LIMIT 10, 2 ou LIMIT 2 OFFSET 10, que retornaria apenas 10 linhas começando no registro 3 (pulando os dois primeiros), teremos que fazer um workaround, utilizando a função ROW_NUMBER() e o BETWEEN (na clausura WHERE).

SELECT *
FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY NOME ASC) AS ROWNUMBER,
NAME, LASTNAME
FROM DB.TABLE_NAME
) AS TMP
WHERE ROWNUMBER BETWEEN 2 AND 10

Dessa forma conseguiremos simular o mesmo resultado que seria obtido pelo LIMIT e OFFSET.

Links úteis:

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>