こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

sqlについて

oracleのsql文の取得制限でrownumがありますがrownumは何順でデータを取得するのでしょうか

投稿日時 - 2011-02-06 16:36:05

QNo.6502439

困ってます

質問者が選んだベストアンサー

ヒットした順です。ただし、WHERE 句で指定するため、適用される
のは ORDER BY 句や GROUP BY 句を適用する前です。

全表走査の場合はブロックの先頭から検索されるのでその順という
ことになるでしょうが、結合がある場合は実行計画により内部的に
ソートされたり、順不定になるものもあるので、一概には言えませ
ん。

投稿日時 - 2011-02-07 10:52:14

ANo.4

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

>order_by_clauseを指定しない場合、同じ問合せで取り出される行の順序が異なることがあります。
とリファレンスにもあるように、順序は不定です。
ソートした結果のうち、N行を取得したいというような場合はNo.2さんが記載されているSQLでいいです。

http://download.oracle.com/docs/cd/E16338_01/server.112/b56299/statements_10002.htm#i2171079

投稿日時 - 2011-02-07 09:28:58

ANo.2

睡眠不足で間違えたので、訂正します。
----------------------------------
何順でもありません。

SELECT * FROM ATABLE WHERE rownum <= 10 ORDER BY AFIELD

とやると、一見 AFIELD 順に 10 件抽出しそうに見えますが、
実は、10 件抽出してからその結果を並べ替えます。

AFIELD 順に 10 件抽出したい場合は、

SELECT B.* FROM (
SELECT * FROM ATABLE ORDER BY AFIELD
) AS B WHERE rownum <= 10

とやる必要があります。

投稿日時 - 2011-02-06 21:31:49

ANo.1

何順でもありません。

SELECT * FROM ATABLE WHERE rownum <= 10 ORDER BY AFIELD

とやると、一見 AFIELD 順に 10 件抽出しそうに見えますが、
実は、10 件抽出してからその結果を並べ替えます。

AFIELD 順に 10 件抽出したい場合は、

SELECT B.* FROM (
SELECT ATABLE.*, rownum AS Num FROM ATABLE ORDER BY AFIELD
) AS B WHERE B.Num <= 10

とやる必要があります。

投稿日時 - 2011-02-06 20:47:54

あなたにオススメの質問