2012-03-19 3 views
0

は、表を参照してください:http://i.stack.imgur.com/4FitK.png異なるテーブルに属するランダムな行数を1つの結果セットにフェッチするか?

誰もがカテゴリと難易度と質問構成の設定で設定した質問の合計数に基づいて、ランダムな質問をフェッチするクエリを作成して私を助けることができます。表。

私は1つを構築しました。

SELECT c.question_id 
, s.question_set_id 
FROM qm_question_category c 
, qm_question_set_cfg s 
WHERE (c.category_id = s.category_id 
AND c.difficulty_level = s.difficulty_level 
) 
AND ROWNUM <= (SELECT SUM(total_questions) 
FROM qm_question_set_cfg 
WHERE question_set_id = 101138) /* Set ID */ 
ORDER BY dbms_random.value 

これは、カテゴリと難易度に基づいて既存の質問からランダムに質問の総数を取得します。

しかし、まず、各カテゴリ+難易度の質問をランダムに取り出し、それらの行を1つの結果セットにマージします。私がしようとしている何

order by rank() over (partition by c.category_id order by dbms_random.value) 

:(。たとえばについて質問構成の設定で設定されCategoryNから10件までカテゴリ2からカテゴリ1からランダムに10問、10)

+0

作成したクエリは結果をランダム化しません。 where節の 'ROWNUM'は' ORDER BY'ステートメントの前に適用されます。結果は一貫していることが保証されていませんが、実際にランダムである可能性は低いです。 – Allan

答えて

0

はこのようorder byを使用してみてください今、あなたは30件のレコードをフェッチして、カテゴリーAの10持っていることを確認することができますので、

category a 
category b 
category c 
category a 
category b 
category c 
... 

10 - を行うには、それはそれはなりますoredrそれ自身のことで、すべてのカテゴリのレコードの順序とランダムでありますカテゴリーbの10およびカテゴリーcの10


UPDATEあなたのコメントを読んだ後、私はあなたがこのような何かを探している可能性があり実現:

select * 
    from (select c.question_id, 
       c.category_id, 
       s.set_id, 
       s.no_of_questions, 
       rank() over(partition by c.category_id order by dbms_random.value) rank 
      from question_category c, question_set_config s 
     where c.category_id = s.category_id 
      and c.difficulty_level = s.difficulty_level 
      and s.set_id = 101138) t 
where rank <= t.no_of_questions 

私はそれぞれランダムな質問に、「行番号」を与えるために()分析関数のランクを使用そのカテゴリ内にある。それで、私は小さい人しか要求できませんno_of_questions

+0

'total_questions'に基づいて各カテゴリに設定された行数をフェッチする方法。 あなたがそのような完全なクエリを構築することによって助けてもらえますか... 質問セットにそれぞれ難易度1と2の2つのカテゴリがあり、5と10という質問はありません... 5つのランダム難易度1の難易度のカテゴリaの質問と難易度2の無作為な質問10を抽出し、これらの(5 + 10)質問IDを結果セットに取り込む。 (画像へのリンクの表diagを参照してください) –

+0

@ DebajyotiDas-私の答えを更新しました、それが助けてくれることを祈っています –

+0

ありがとうたくさん...それは働いた... :) –

関連する問題