web-dev-qa-db-fra.com

Comment faire SQL sélectionner top N ... dans AS400

Comment effectuez-vous un

Select top N * from as400table

tapez une requête sur une base de données as400/db2

27
James Moore
Select col1,col2
from 
as400table
where col1='filter'
order by col1
fetch first N row only

N'oubliez pas de définir un ORDER BY clause, car DB2 ne garantit pas que les lignes renvoyées par FETCH FIRST N ROW ONLY sont toujours les mêmes N.

46
James Moore

Strictement, il n'y a pas d'équivalent de TOP N dans DB2.

SELECT 1 FROM sysibm.sysdummy1
    WHERE EXISTS (SELECT 2 FROM sysibm.sysdummy1)
FETCH FIRST ROW ONLY

compile et exécute, mais

SELECT 1 FROM sysibm.sysdummy1
    WHERE EXISTS (SELECT 2 FROM sysibm.sysdummy1 FETCH FIRST ROW ONLY)

ne compilera pas.

TOP N et FETCH FIRST N ne sont pas les mêmes. Vous ne pouvez utiliser que FETCH FIRSTne fois par requête, tandis que TOP N peut être utilisé dans n'importe quelle sous-sélection.

Vous pouvez utiliser une fonction de fenêtre dans une sous-requête afin de simuler TOP N:

select *
from (
    select id, row_number()
    over (order by id) as rn
    from testsch.testtbl
) as r
where r.rn < 100 -- This is N rows you are looking for

Cela renverra exactement 99 lignes. J'ai essayé cela dans iSeries 7 et cela a fonctionné.

13
ajeh

Je ne suis qu'un bébé-geek en ce qui concerne IBM - je suis un gars de SQL Server. Mais j'ai trouvé que l'approche du nombre réel (que j'ai utilisée avec succès dans Oracle) ne fonctionnait pas dans DB2. J'ai utilisé celui-ci:

SELECT
     MYFIELD 
FROM
     "SCHEMANAME"."TABLENAME" 
WHERE
     FILTERCOL1 = 000001 
     AND FILTERCOL2 = 1 
ORDER BY
     MYFIELD DESC FETCH FIRST ROW ONLY

(J'ai ordonné décroissant parce que j'avais besoin de la dernière valeur.)

J'espère que cela t'aides. Joey

0
Joseph Morgan

Ne serait-il pas plus facile de limiter le résultat à la place? Le soufflet est en ordre par date et je prends le meilleur résultat

SELECT banana_equipment_id 
FROM new_banana_equipment 
WHERE banana_code=0000001
ORDER BY banana_date DESC 
LIMIT 1;
0
Gunay Anach