web-dev-qa-db-ja.com

AS400でSQL select top N ...を実行する方法

どのように実行しますか

Select top N * from as400table

as400/db2データベースに対するタイプクエリ

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

DB2はORDER BYによって返される行が常に同じNであることを保証しないため、FETCH FIRST N ROW ONLY句を設定することを忘れないでください。

46
James Moore

厳密には、DB2にはTOP Nに相当するものはありません。

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

コンパイルして実行しますが、

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

コンパイルしません。

TOP NFETCH FIRST Nは同じではありません。使用できるのはFETCH FIRSTクエリごとに1回ですが、TOP N任意の副選択で使用できます。

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

これにより、正確に99行が返されます。 iSeries 7で試してみましたが、うまくいきました。

13
ajeh

IBMに関しては、私はただのオタクです。私はSQL Serverの男です。しかし、行番号のアプローチ(Oracleで正常に使用されています)がDB2で機能しないことがわかりました。私はこれを使用しました:

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

(最後の値が必要なため、降順を注文しました。)

お役に立てれば。ジョーイ

0
Joseph Morgan

代わりに結果を制限する方が簡単ではないでしょうか?ベローは日付順であり、私は最高の結果を取ります

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