Oracle の rownum の動きについて調べる。例えば、次のようなSQL文を実行すると、
select * from A where B order by C
rownum が振られるタイミングは以下みたいな感じ。
rownum = 1 for x in ( select * from A ) loop if ( x を条件 B でチェック) then 行を出力 rownum = rownum + 1 end if; end loop; C でソート
という感じで、
- FROM/WHERE 句を処理
- 行を吐き出しと ROWNUM 増やして割り当て
- SELECT を適用
- GROUP BY を適用
- HAVING を適用
- ORDER BY を適用
という感じの順に処理していく。そんなわけで、
select * from A where ROWNUM > 1
みたいなことやっても行は得られん(rownumが増えないから)。
という感じで、On ROWNUM and Limiting Resultsに書いてあった。一つ賢くなった