2012-03-13 5 views
6

は、私は次のクエリを持っています。なぜ=演算子は値1以外のROWNUMで動作しませんか?レコードが、私は確信してABCテーブルに25件の以上のレコードを持って、私の目的は、n番目のレコードを表示することです</p> <p>を表示しないように:</p> <pre><code>select * from abc where rownum = 10 </code></pre> <p><strong>出力</strong>:

私のようにクエリを記述する場合: -

select * from abc where rownum = 1 

それが正常に動作し、私に最初のレコードを提供します。最初のレコード以外のレコードはありません。

答えて

18

が返された行に行番号が順番に割り当てられるため、

あなたの声明がどのように機能するかは次のとおりです。最初の候補行を取得し、一時的に行番号1を与えます。行番号1は条件に一致しないため、破棄されます。

次に、2番目の候補行が得られます。には、行番号1が指定されています(前の行が投げられていたため)。どちらとも一致しません。

次に3番目の候補行...まあ、今どこに行くのか分かりますよ。要するに、あなたはその条件を満たす行を見つけることはありません。

行番号は、= 1,< somethingまたは<= somethingにのみ有効です。

これはすべてOracle docs for the rownum pseudo-columnで説明されています。

SQLは、順序を指定しない限り、順序付けられていないセットを返すリレーショナル代数であることにも注意してください。つまり、行番号10は現在何か、何か他のものは3分である可能性があります。

あなたはn番目の行を取得する(場しのぎ、確かに)方法をしたい場合は、(5行目用)のようなものを使用することができますが:

select * from (
    select * from (
     select col1, col2, col3 from tbl order by col1 asc 
    ) where rownum < 6 order by col1 desc 
) where rownum = 1 

内側の選択は、あなたが一貫性の順序を持​​っていることを確認しますクエリを実行する前に行を投げ捨てると、真ん中の選択はそれから最初の5行を除くすべての行を破棄し、順序を逆にします。

外側の選択は、反転セットの最初の行(昇順であったときの5行セットの最後の行)のみを返します。

良い方法はおそらくです:

select * from (
    select rownum rn, col1, col2, col3 from tbl order by col1 
) where rn = 5 

これは結果をフィルタリングすること、実際の列番号を使用して、その後、すべてのものを検索し、「本物」の列にROWNUMを割り当てることによって動作します。

+0

ありがとうございます。私の目的を達成するための何か他の方法をお勧めしますか?つまり、nの値を知っていればn番目のレコードを表示しますか? –

+0

ありがとうございます。オラクルのドキュメントにはこう書いてあります:UPDATE my_table SET column1 = ROWNUM; テーブルに実際の列があり、その結果をフィルタリングします。 :) –

+1

@SaharHassan、その唯一の問題は、あなたがそれを維持する必要があるということです。言い換えれば、おそらくトリガーや自動インクリメント列が必要です。しかし、明示的に指示しない限り、結果セットは本質的に_unsorted_という事実に役立ちません。 – paxdiablo

関連する問題

 関連する問題