順序付け後に Oracle クエリによって返される行数を制限するにはどうすればよいですか? 質問する

順序付け後に Oracle クエリによって返される行数を制限するにはどうすればよいですか? 質問する

Oracleクエリに MySQL 句が含まれているかのように動作させる方法はありますかlimit?

MySQL では、次のように実行できます。

select * 
from sometable
order by name
limit 20,10

21 行目から 30 行目を取得します (最初の 20 行をスキップし、次の 10 行を取得します)。行は の後に選択されるorder byため、実際にはアルファベット順で 20 番目の名前から始まります。

Oracle では、擬似列についてのみ言及されていますが、これはの前にrownum評価されます。つまり、次のようになります。 order by

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

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

ベストアンサー1

これにはサブクエリを使用できます。

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 の記事からコピー)

更新 2 : Oracle 12c (12.1) 以降では、行を制限したりオフセットから開始したりするための構文が使用できます。

-- only get first 10 results
SELECT * 
FROM   sometable
ORDER BY name
FETCH FIRST 10 ROWS ONLY;

-- get result rows 20-30
SELECT * 
FROM   sometable
ORDER BY name
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

見るこの答えより多くの例については、ヒントを提供してくれた Krumia に感謝します。

おすすめ記事