How to do SQL select top N … in AS400

半腔热情 提交于 2019-12-04 08:09:41

问题


How do you perform a

Select top N * from as400table

type query against an as400/db2 database


回答1:


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

Remember to set an ORDER BY clause, because DB2 does not guarantee that the rows returned by FETCH FIRST N ROW ONLY are always the same N.




回答2:


Strictly, there is no equivalent of TOP N in DB2.

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

compiles and runs, but

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

will not compile.

TOP N and FETCH FIRST N are not the same. You can only use FETCH FIRST once per query, whereas TOP N can be used in any sub-select.

You can use a window function in a sub-query in order to simulate 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

This will return exactly 99 rows. I tried that in iSeries 7 and it worked.




回答3:


I am only a baby-geek when it comes to IBM--I am a SQL Server guy. But I found the rownumber approach (which I have used successfully in Oracle) did not work in DB2. I used this one:

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

(I ordered descending because I needed the last value.)

Hope this helps. Joey




回答4:


Wouldn't it be easier to limit the result instead? Bellow is in order by date and I take the top result

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



回答5:


It's an old thread, thought I would contribute

Consider using RANK() OVER() for the top n balances?

WITH RANK_TBL AS
        (SELECT FIELD1 AS "ENDING BALANCE",
         RANK() OVER(ORDER BY FIELD1 DESC) AS "RANK NUMBER"
         FROM LIBRARY/TABLE)
SELECT *
FROM RANK_TBL
WHERE "RANK NUMBER" < 6 


来源:https://stackoverflow.com/questions/2850423/how-to-do-sql-select-top-n-in-as400

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!