How to do SQL select top N … in AS400

前端 未结 6 746
执笔经年
执笔经年 2020-12-28 13:40

How do you perform a

Select top N * from as400table

type query against an as400/db2 database

相关标签:
6条回答
  • 2020-12-28 14:04
    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.

    0 讨论(0)
  • 2020-12-28 14:06

    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;
    
    0 讨论(0)
  • 2020-12-28 14:20

    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.

    0 讨论(0)
  • 2020-12-28 14:21

    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 
    
    0 讨论(0)
  • 2020-12-28 14:22

    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

    0 讨论(0)
  • 2020-12-28 14:23

    I know this is a old thread but probably my answer help to someone, the best way to limit a number of rows in AS400 is using FETCH FIRST 1000 ROWS ONLY Example: select * from myschema.mytable_name FETCH FIRST 1000 ROWS ONLY

    This will give you back the first 1000 rows.

    Of course the 1000 you can change for whatever other value needed, 10, 25, 10000, etc.

    At least this works for me in AS400 database (29-06-2020)

    Best

    0 讨论(0)
提交回复
热议问题