Question

Habituellement, je dois récupérer les données d'une table dans une plage donnée. Par exemple, une page distincte pour chaque résultat de recherche. Dans MySQL, j'utilise le mot clé LIMIT mais dans DB2, je ne le sais pas. Maintenant, j'utilise cette requête pour récupérer une plage de données.

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

mais je sais que c'est mauvais style. Alors, comment interroger pour obtenir les meilleures performances?

Était-ce utile?

La solution

Mes besoins ont déjà été ajoutés à DB2 9.7.2.

DB2 9.7.2 ajoute une nouvelle syntaxe pour le résultat de la requête limite, comme illustré ci-dessous:

SELECT * FROM TABLE LIMIT 5 OFFSET 20

la base de données récupérera le résultat de la ligne no. 21 - 25

Autres conseils

Vous ne savez pas pourquoi vous créez la table TMP. RUNNING_NO n'est-il pas en ordre croissant? Je penserais:

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

donnerait les mêmes résultats.

Le fait d'avoir un INDEX sur NAME sur la table EMPLOYEE augmentera les performances de cette requête.

C'est très difficile, cela dépend de quelle base de données disposez-vous.

par exemple:

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top