98 votes

L'équivalent de LIMITE pour DB2

Comment faites-vous LIMIT dans DB2 for iSeries?

J'ai une table avec plus de 50 000 enregistrements et je veux renvoyer des enregistrements de 0 à 10 000, et les registres de 10 000 à 20 000.

Je sais en SQL, vous écrivez LIMIT 0,10000 à la fin de la requête pour les 0 à 10 000 LIMIT 10000,10000 à la fin de la requête pour 10000 à 20000

Alors, comment est-ce fait dans DB2? Quel est le code et la syntaxe? (complet exemple de requête est apprécié)

149voto

Joe Points 17829

À l'aide de 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;

Pour obtenir des plages, vous devez utiliser ROW_NUMBER() (depuis v5r4) et de l'utiliser à l'intérieur de l' WHERE clause: (volée à partir d'ici: 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;

13voto

elcool Points 727

Développé cette méthode:

Vous avez BESOIN d'une table qui a une valeur unique qui peut être commandé.

Si vous souhaitez que les lignes de 10 000 à 25 000, et votre Table de 40 000 lignes, vous devez d'abord obtenir le point de départ et le nombre total des lignes:

int start = 40000 - 10000;

int total = 25000 - 10000;

Et puis passer ces par le code de la requête:

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

7voto

Tom Barron Points 242

Voici la solution que j'ai trouvé:

select FIELD from TABLE where FIELD > LASTVAL order by FIELD fetch first N rows only;

Par l'initialisation de la LASTVAL à 0 (ou " pour un champ de texte), puis en fixant à la dernière valeur de la plus récente série de records, ce sera l'étape à travers la table en blocs de N enregistrements.

2voto

bluish Points 5503

@elcool la solution est une bonne idée, mais vous devez savoir nombre total de lignes (qui peut même changer pendant l'exécution de la requête!). Je propose donc une version modifiée, qui, malheureusement, a besoin de 3 sous-requêtes au lieu 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

{last} doit être remplacé par le numéro de ligne du dernier album que j'ai besoin et {length} doit être remplacé par le nombre de lignes dont j'ai besoin, calculé comme last row - first row + 1.

E. g. si je veux les lignes de 10 à 25 (totalement 16 lignes), {last} sera de 25 et {length} sera 25-10+1=16.

1voto

David Sky Points 19

Vous devriez également envisager de les OPTIMISER POUR les n LIGNES de la clause. Plus de détails sur tout cela dans la DB2 LUW de la documentation dans les lignes Directrices pour la restriction des instructions SELECT sujet:

  • L'OPTIMISER POUR la clause déclare l'intention de récupérer uniquement un sous-ensemble de la suite ou de donner la priorité à la récupération de seulement les premières lignes. L'optimiseur peut ensuite choisir les plans d'accès qui permettent de minimiser le temps de réponse pour la récupération de la première quelques lignes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X