2010-05-17 29 views

Respuesta

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

Recuerde que debe establecer una cláusula de ORDER BY, porque DB2 no garantiza que las filas devueltas por FETCH FIRST N ROW ONLY sean siempre las mismas N.

10

Estrictamente, no hay un equivalente de TOP N en DB2.

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

compila y ejecuta, pero

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

no se compilará.

y FETCH FIRST N no son lo mismo. Solo puede usar FETCH FIRSTuna vez por consulta, mientras que TOP N se puede usar en cualquier sub-selección.

Se puede utilizar una función de ventana en una sub-consulta con el fin de simular 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 

Esto devolverá exactamente 99 filas. Lo intenté en iSeries 7 y funcionó.

+0

Fabulous! Esta debería ser la respuesta correcta. :-) FETCH FIRST N ROWS SOLAMENTE es útil, pero no semánticamente equivalente al 100%. Bravo. –

0

Solo soy un geek bebé cuando se trata de IBM - Soy un tipo de SQL Server. Pero encontré que el enfoque Rownumber (que he utilizado con éxito en Oracle) no funcionó en DB2. Solía ​​éste:

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

(. Me ordenaron descender porque necesitaba el último valor) Esperanza

esto ayuda. Joey

0

¿No sería más fácil limitar el resultado en su lugar? El fuelle está en orden por fecha y tomo el resultado principal

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

** LIMIT n ** se puede usar en DB2 para i 7.1 y posterior, pero debe tenerse en cuenta que es solo una sintaxis alternativa para _fetch-first-clause_. El mismo comportamiento ocurre con ** LIMIT 1 ** como con ** FETCH 1 SOLAMENTE **. – user2338816

Cuestiones relacionadas