2

私は 2 つの 2 つのテーブルを持っquestionpoolquestionquestionますquestion pool。正しいランダム結果を返すサブ選択クエリを使用してクエリを作成しましたが、questionテーブルから複数の列を返す必要があります。

クエリの目的は、「質問プール」テーブルの「QuizID」ごとに「質問」テーブルからランダム テストを返すことです。

SELECT QuestionPool.QuestionPoolID,
(
SELECT TOP (1) Question.QuestionPoolID
FROM Question
WHERE Question.GroupID = QuestionPool.QuestionPoolID
ORDER BY NEWID()
)
FROM QuestionPool
WHERE QuestionPool.QuizID = '5'
4

4 に答える 4

3

OUTER APPLY はこれに適しています。

Select *
FROM QuestionPool
OUTER APPLY
(
    SELECT TOP 1 * 
    FROM Question
    WHERE Question.GroupID = QuestionPool.QuestionPoolID
    ORDER BY NEWID()
) x
WHERE QuestionPool.QuizID = '5'

OUTER APPLY の別の使用例http://www.ienablemuch.com/2012/04/outer-apply-walkthrough.html


ライブ テスト: http://www.sqlfiddle.com/#!3/d8afc/1

create table m(i int, o varchar(10));
insert into m values
(1,'alpha'),(2,'beta'),(3,'delta');

create table x(i int, j varchar, k varchar(10));

insert into x values
(1,'a','hello'),
(1,'b','howdy'),
(2,'x','great'),
(2,'y','super'),
(3,'i','uber'),
(3,'j','neat'),
(3,'a','nice');


select m.*, '' as sep, r.*
from m
outer apply
(
  select top 1 *
  from x
  where i = m.i
  order by newid()
) r
于 2012-05-12T01:21:51.610 に答える
0

共通テーブル式 (CTE) は、この種の場合にかなり便利です...

http://msdn.microsoft.com/en-us/library/ms175972(v=sql.90).aspx

于 2012-05-11T19:39:47.950 に答える
0

SQLサーバーに精通していませんが、これでうまくいくことを願っています:

Select QuestionPool.QuestionPoolID, v.QuestionPoolID, v.xxx -- etc
FROM   QuestionPool
JOIN
       (
        SELECT   TOP (1) *
        FROM     Question
        WHERE    Question.GroupID = QuestionPool.QuestionPoolID
        ORDER BY NEWID()
       ) AS v ON v.QuestionPoolID = QuestionPool.QuestionPoolID
WHERE  QuestionPool.QuizID = '5'
于 2012-05-11T19:13:08.070 に答える
0

クエリは、QuizId フィルターの対象となる各 QuestionPool.QuestionPoolId に対して任意の Question.QuestionPoolId を返しているようです。

次のクエリがこれを行うと思います:

select qp.QuestionPoolId, max(q.QuestionPoolId) as any_QuestionPoolId
from Question q join
     qp.QuestionPoolId qp
     on q.GroupId = qp.QuestionPoolId
 WHERE QuestionPool.QuizID = '5' 
group by qp.QuestionPoolId

これは特定の質問を返します。

次のクエリを使用すると、より多くのフィールドを取得できます。

select qp.QuestionPoolId, q.*
from (select q.*, row_number() over (partition by GroupId order by (select NULL)) as randrownum
      from Question q
     ) join
     (select qp.QuestionPoolId, max(QuetionPool qp
     on q.GroupId = qp.QuestionPoolId
 WHERE QuestionPool.QuizID = '5' and
       randrownum = 1

これは、row_number() を使用して行を任意に列挙します。「Select NULL」はランダムな順序を提供します (または、「order by GroupId」を使用することもできます。

于 2012-05-11T19:22:59.450 に答える