1. ホーム
  2. sql

[解決済み】Oracleクエリが順序付け後に返す行数を制限するにはどうすればいいですか?

2022-03-23 18:54:25

質問

を作成する方法はありますか? Oracle クエリの動作は、MySQL の limit 節がありますか?

MySQLでは、こんなことができるんです。

select * 
from sometable
order by name
limit 20,10

で、21行目から30行目までを取得します(最初の20行を飛ばして、次の10行を取得します)。行が選択されるのは order by そのため、アルファベット順で20番目の名前から始まります。

オラクルでは、みんなが口にするのは rownum 擬似カラムが評価されるが 前に order by というのは、こういう意味です。

select * 
from sometable
where rownum <= 10
order by name

は名前で並べられた10行のランダムなセットを返しますが、これは通常私が欲しいものではありません。また、オフセットを指定することもできません。

どのように解決するのですか?

サブクエリを使用することで、このようなことが可能になります。

select *
from  
( select * 
  from emp 
  order by sal desc ) 
where ROWNUM <= 5;

トピックもご覧ください。 ROWNUMと結果の制限について にて、Oracle/AskTomの詳細情報をご確認ください。

更新情報 : 下限と上限の両方で結果を制限するために、以下のように少し肥大化します。

select * from 
( select a.*, ROWNUM rnum from 
  ( <your_query_goes_here, with order by> ) a 
  where ROWNUM <= :MAX_ROW_TO_FETCH )
where rnum  >= :MIN_ROW_TO_FETCH;

(指定されたAskTom-articleからのコピーです。)

更新情報2 : Oracle 12c (12.1) からは、行を制限したり、オフセットで開始する構文が利用できるようになりました。

SELECT * 
FROM   sometable
ORDER BY name
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

参照 この回答 をご覧ください。ヒントをくださったKrumiaさんに感謝します。