どのように実行しますか
Select top N * from as400table
as400/db2データベースに対するタイプクエリ
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
句を設定することを忘れないでください。
厳密には、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 N
とFETCH 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で試してみましたが、うまくいきました。
IBMに関しては、私はただのオタクです。私はSQL Serverの男です。しかし、行番号のアプローチ(Oracleで正常に使用されています)がDB2で機能しないことがわかりました。私はこれを使用しました:
SELECT
MYFIELD
FROM
"SCHEMANAME"."TABLENAME"
WHERE
FILTERCOL1 = 000001
AND FILTERCOL2 = 1
ORDER BY
MYFIELD DESC FETCH FIRST ROW ONLY
(最後の値が必要なため、降順を注文しました。)
お役に立てれば。ジョーイ
代わりに結果を制限する方が簡単ではないでしょうか?ベローは日付順であり、私は最高の結果を取ります
SELECT banana_equipment_id
FROM new_banana_equipment
WHERE banana_code=0000001
ORDER BY banana_date DESC
LIMIT 1;