0

私は 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

これにより、速度が大幅に低下します。何故ですか?

4

2 に答える 2

10

なぜこれが遅くなると思いますか?Oracle は必ずしもサブクエリをインスタンス化するとは限りません。

サブクエリで記述しなければならない理由は 2 つあります。select1つ目は、節で定義された変数を節で使用できないことですfrom。これを行うには、サブクエリが必要です。

2つ目は、言えないということですwhere rownum between 2 and 10rownumからデータが返されると、の値が設定されますselect。最初の行が返されない場合、2 番目の行は表示されません。

パフォーマンスが気になる場合は、次のようにします。

select *
from (select rownum n, t.*
      from table t
      where rownum <= 10
     )
where n between 2 and 10

編集:

rownumなしで使用するorder byと、実行ごとに異なる可能性がある任意の行セットが返されます。「ランダムな」セットは返されません (これを行うのははるかに困難です)。テーブルに挿入された最初の行を返すように見えるかもしれませんが、それは保証されていません。

どの行が返されるかではなく、「行を返さない」という問題があったため、この形式で解決策を残しています。ただし、order bythis なしでは (Rob がコメントで述べているように) と同等rownum <= 9です。

于 2013-06-22T03:05:37.353 に答える
1

レコードに 2 ~ 10 の番号を付けたいだけの場合は、サブクエリを実行する必要はありません。

SELECT rownum + 1 AS n, s.*
  FROM vzwnet.site_inst s
  WHERE rownum < 10
于 2013-06-22T03:59:23.317 に答える