2010-05-17 7 views

Antwort

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

Denken Sie daran, eine ORDER BY Klausel festlegen, weil DB2 garantiert nicht, dass die Zeilen, die von FETCH FIRST N ROW ONLY zurückgegeben werden, immer gleich N sind.

10

Genau genommen gibt es kein Äquivalent von TOP N in DB2.

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

kompiliert und ausgeführt, aber

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

kompilieren nicht.

TOP N und FETCH FIRST N sind nicht gleich. Sie können FETCH FIRSTnur einmal pro Abfrage verwenden, wobei in einem beliebigen Sub-select verwendet werden kann.

Sie können eine Fensterfunktion in einer Unterabfrage, um TOP N zu simulieren verwenden:

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 

Dies wird genau 99 Zeilen zurück. Ich habe das in iSeries 7 ausprobiert und es hat funktioniert.

+0

Fabulous! Dies sollte die richtige Antwort sein. :-) FETCH FIRST N ROWS ONLY ist nützlich, aber nicht semantisch 100% äquivalent. Bravo. –

0

Ich bin nur ein Baby-Aussenseiter, wenn es um IBM geht - ich bin ein SQL Server-Typ. Aber ich fand, dass der Ansatz der Zeilennummerierung (den ich erfolgreich in Oracle verwendet habe) in DB2 nicht funktioniert hat. Ich habe diese ein:

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

(. Ich absteigend geordnet, weil ich den letzten Wert erforderlich)

Hoffnung, das hilft. Joey

0

Wäre es nicht einfacher, das Ergebnis stattdessen zu begrenzen? Bellow ist in Ordnung nach Datum und ich nehme das beste Ergebnis

SELECT banana_equipment_id 
FROM new_banana_equipment 
WHERE banana_code=0000001 
ORDER BY banana_date DESC 
LIMIT 1; 
+1

** LIMIT n ** kann in DB2 für i 7.1 und höher verwendet werden, aber es sollte beachtet werden, dass es sich nur um eine alternative Syntax für eine _fetch-first-Klausel_ handelt. Das gleiche Verhalten passiert mit ** LIMIT 1 ** wie bei ** FETCH 1 ONLY **. – user2338816