私は rownum でこの癖を持っています:
select rownum as n, s.* from vzwnet.site_inst s where n between 2 and 10 --> dones not work
私はそれを次のように置く必要があります:
select * from (select rownum n, t.* from table t) where n between 2 and 10
これにより、速度が大幅に低下します。何故ですか?
なぜこれが遅くなると思いますか?Oracle は必ずしもサブクエリをインスタンス化するとは限りません。
サブクエリで記述しなければならない理由は 2 つあります。select
1つ目は、節で定義された変数を節で使用できないことですfrom
。これを行うには、サブクエリが必要です。
2つ目は、言えないということですwhere rownum between 2 and 10
。rownum
からデータが返されると、の値が設定されますselect
。最初の行が返されない場合、2 番目の行は表示されません。
パフォーマンスが気になる場合は、次のようにします。
select *
from (select rownum n, t.*
from table t
where rownum <= 10
)
where n between 2 and 10
編集:
rownum
なしで使用するorder by
と、実行ごとに異なる可能性がある任意の行セットが返されます。「ランダムな」セットは返されません (これを行うのははるかに困難です)。テーブルに挿入された最初の行を返すように見えるかもしれませんが、それは保証されていません。
どの行が返されるかではなく、「行を返さない」という問題があったため、この形式で解決策を残しています。ただし、order by
this なしでは (Rob がコメントで述べているように) と同等rownum <= 9
です。
レコードに 2 ~ 10 の番号を付けたいだけの場合は、サブクエリを実行する必要はありません。
SELECT rownum + 1 AS n, s.*
FROM vzwnet.site_inst s
WHERE rownum < 10