2

2つのテーブルがあります。1つは質問、もう1つは回答です。質問スキーマは、質問ID、質問、モジュールIDで構成されます。1つのmoduleidには多くの質問があります。

Questionid   Question    Moduleid(FK)
--------     -----       -------
1            q1             1
2            q2             1
3            q4             2
4            q5             2

回答スキーマは3つの列で構成されています

answerid     Answer    questionid(FK)
--------     -----       -------
1            a1             1
2            a2             2
3            a4             3
4            a5             4

tblquestionsの@moduleidをパラメーターとして送信するストアドプロシージャを構築しようとしています。特定のmoduleidのすべての質問にtblquestionsで回答した場合は、「1」を返します。(1つの質問のtblanswersには1つの回答しかありません)または、すべての質問に回答していない場合は0を返します。このアプローチを行う方法について何か助けはありますか?

4

3 に答える 3

4

おそらくもっと簡単なものがあるかもしれませんが、これはうまくいくはずで、簡単に変更して、すべての回答済み/未回答のモジュール、またはモジュールの不足している回答などを返すことができます。

SELECT CASE 
     WHEN EXISTS (SELECT 1 
                  FROM   tblquestions AS q 
                         INNER JOIN tblanswers AS a 
                                 ON q.questionid = a.questionid 
                  WHERE  ( q.moduleid = @ModuleId ) 
                         AND ( NOT EXISTS (SELECT 1 
                                           FROM   tblquestions AS q 
                                                  LEFT OUTER JOIN 
                                                  tblanswers AS a 
                                                               ON 
                                                  q.questionid = 
                                                  a.questionid 
                                           WHERE  ( q.moduleid = @ModuleId ) 
                                                  AND ( a.answerid IS NULL ) 
                                          ) )) 
   THEN 1  ELSE 0 
   END  AS AllQuestionsAnswered

すべてのモジュール ID を含むsql-fiddleを次に示します。結果は次のとおりです。

  • モジュール ID = 1 => 1
  • モジュール ID = 2 => 1
  • モジュール ID = 3 => 0
于 2013-01-19T09:51:46.283 に答える
2

このクエリをストアド プロシージャ内に配置します。

SELECT  CASE WHEN (COUNT(a.QuestionID) = COUNT(b.QuestionID))
            THEN 1 
            ELSE 0
        END as AreAllAnswered
FROM    questions a
        LEFT JOIN answers b
            ON a.QuestionID = b.questionID
WHERE   a.ModuleID = @valueHere

句が表示されない理由GROUP BYは、レコードが既に特定ModuleIDのみでフィルター処理されているためです。

完全なストアド プロシージャ コード

CREATE PROCEDURE ProcNameHere (@ModuleID INTEGER) 
AS 
    SELECT  CASE WHEN (COUNT(a.QuestionID) = COUNT(b.QuestionID))
                THEN 1 
                ELSE 0
            END as AreAllAnswered
    FROM    questions a
            LEFT JOIN answers b
                ON a.QuestionID = b.questionID
    WHERE   a.ModuleID = @ModuleID
GO

更新 1

OPがすべての質問に対して複数の回答を許可している場合、クエリにわずかな変更しかありません。

CREATE PROCEDURE ProcNameHere (@ModuleID INTEGER) 
AS 
    SELECT  CASE WHEN (COUNT(DISTINCT a.QuestionID) = COUNT(DISTINCT b.QuestionID))
                THEN 1 
                ELSE 0
            END as AreAllAnswered
    FROM    questions a
            LEFT JOIN answers b
                ON a.QuestionID = b.questionID
    WHERE   a.ModuleID = @ModuleID
GO
于 2013-01-19T09:45:22.620 に答える
0
 I hope this may work....

 declare @que int
 declare @ans int
 set @que=( select count(*) from Question where moduleid=1)
 set @ans=(select count(Answer.questionid) from Answer inner join Question
 on Question.Questionid=Answer.questionid where Question.moduleid=1)
 if(@que = @ans)
 begin
   select 1
 end
 else
 begin
   select 0
 end
于 2013-01-19T09:48:56.587 に答える