Pergunta

Normalmente, eu preciso para recuperar dados de uma tabela em algum intervalo; por exemplo, uma página separada para cada resultado da pesquisa. No MySQL I palavra-chave uso limite, mas no DB2 eu não sei. Agora eu usar essa consulta para recuperar intervalo de dados.

SELECT * 
FROM(
   SELECT  
      SMALLINT(RANK() OVER(ORDER BY NAME DESC)) AS RUNNING_NO
      , DATA_KEY_VALUE
      , SHOW_PRIORITY
   FROM 
      EMPLOYEE
   WHERE 
      NAME LIKE 'DEL%'
   ORDER BY
      NAME DESC
   FETCH FIRST 20 ROWS ONLY
) AS TMP
ORDER BY 
  TMP.RUNNING_NO ASC
FETCH FIRST 10 ROWS ONLY

mas eu sei que é mau estilo. Então, como consulta para melhor desempenho?

Foi útil?

Solução

Minha exigência foram adicionados em DB2 9.7.2 já.

DB2 9.7.2 adiciona nova sintaxe para resultado da consulta limite de como ilustrar abaixo:

SELECT * FROM TABLE LIMIT 5 OFFSET 20

o banco de dados irá recuperar resultado de linha não. 21-25

Outras dicas

Não sei por que você está criando a tabela de TMP. não é RUNNING_NO aready em sequência ascendente? Gostaria de pensar:

SELECT SMALLINT(RANK() OVER(ORDER BY NAME DESC)) AS RUNNING_NO,
       DATA_KEY_VALUE,
       SHOW_PRIORITY
  FROM EMPLOYEE
 WHERE NAME LIKE 'DEL%'
 ORDER BY NAME DESC
 FETCH FIRST 10 ROWS ONLY

daria os mesmos resultados.

cujo índice sobre o nome na mesa o empregado irá aumentar o desempenho desta consulta.

É muito difícil, é depende de qual banco de dados que você tem.

Por exemplo:

SELECT * FROM ( 
    SELECT 
      ROW_NUMBER() OVER (ORDER BY ID_USER ASC) AS ROWNUM,  
      ID_EMPLOYEE, FIRSTNAME, LASTNAME 
    FROM EMPLOYEE 
    WHERE FIRSTNAME LIKE 'DEL%' 
  )  AS A WHERE A.rownum
BETWEEN 1 AND 25
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top