问题
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