2016-08-07 8 views
0

Oracle SQLの特定の行のフィールドtidから値を返そうとしていますが、私は奇妙な動作をしています。複数の行が返され、Oracle SQLの特定の行を選択しようとしています

select tid from 
(select tid, rownum as rn from 
     (select tid from Train)) 
where rn=5; 

、行5の値が正常に返される:

まず、私はこれを試みました。しかし、私は次の操作を実行して、1から15までROWNUMを持つ行を取るために値をランダム化しようとすると:

select tid from 
(select tid, rownum as rn from 
     (select tid from Train)) 
where rn=round(dbms_random.value(1,15)); 

より多くの行が1つだけでなく、返されます。私は間違って何をしていますか?

答えて

1

これは、行ごとにdbms_random()が呼び出されるため、重複した結果が生成される可能性があるためです。あなたは1つのランダムな行をしたい場合は代わりに、このような何かを試してみてください。

select tid 
from (select tid, 
      row_number() over (order by dbms_random.value()) as seqnum 
     from Train 
    ) t 
where seqnum = 1; 

これは、常に「SEQNUM = 1」を持つ行を返しますが、それはランダムtidになります。

+0

'dbms_random()'が各行に対して呼び出されるだけであれば、補助変数 'aux:= round(dbms_random.value(1、15))'を使用すれば十分でしょう。 2つのソリューション間のパフォーマンスの違いについての考え方はありますか? – randombee

+0

@randombee。 。 。よく分かりません。パフォーマンスが重要な場合は、両方の方法で試す価値があります。 –

関連する問題