2016-08-17 21 views
1

クイズのすべての質問に関する情報を選択するためのクエリを作成しています(ModuleId)。質問、回答キー、およびグレーダー情報があれば、最新のユーザー回答が必要です。ジョイン・テーブルに行がない場合に行が選択されない

CREATE PROCEDURE spGetQuestionsAnswersMostRecentUserAnswersAndRevisions 
    (@UserId char(7), @ModuleId int) 
AS 
    SELECT 
     ua.QuestionId, ua.UserAnswerId, UserAnswer, Question, Answer, 
     TypeId, GraderRevision, IsAnswerCorrect 
    FROM 
     UserAnswersByModule ua 
    INNER JOIN 
     QuestionsAnswersByModule qa ON qa.QuestionId = ua.QuestionId 
    INNER JOIN 
     GradedAnswersByQuestion ga ON ga.UserAnswerId = ua.UserAnswerId 
    WHERE 
     ua.UserAnswerId IN (SELECT MAX(UserAnswerId) AS MostRecentUserAnswer 
          FROM UserAnswersByModule 
          WHERE ModuleId = @ModuleId 
           AND UserId = @UserId 
           AND IsActive = 1 
          GROUP BY QuestionId) 
     AND ga.RevisionId IN (SELECT MAX(RevisionId) AS MostRecentRevisionId 
           FROM GradedAnswersByQuestion GA 
           INNER JOIN UserAnswersByModule ON ga.UserAnswerId = ua.UserAnswerId 
           WHERE UserId = @UserId 
           AND ModuleId = @ModuleId 
           GROUP BY GA.UserAnswerId) 

これはテーブルが設定されている方法です。

QuestionAnswersByModule

PK - QuestionId 

UserAnswersByModule

PK - UserAnswerId 
FK - QuestionAnswersByModule.QuestionId 

GradedAnswersByQuestion

PK - RevisionId 
FK - UserAnswersByModule.UserAnswerId 

私のクエリでの問題は、特定のUserAnswerIdためGradedAnswersByQuestionで何かがない場合、クエリはこれらの2列の残りのすべてでは何も、代わりにnullを返しません、ということです情報。私はかなりそれがAND ga.RevisionId IN ...のためだと確信していますが、私はそれを書く方法を考えることはできません。どんな助けもありがとう。

答えて

0

おそらくこの...

CREATE PROCEDURE spGetQuestionsAnswersMostRecentUserAnswersAndRevisions(@UserId char(7),@ModuleId int) AS 
SELECT ua.QuestionId, ua.UserAnswerId, UserAnswer, Question, Answer, TypeId, GraderRevision, IsAnswerCorrect 
FROM UserAnswersByModule ua 
INNER JOIN QuestionsAnswersByModule qa 
ON qa.QuestionId = ua.QuestionId 
LEFT OUTER JOIN GradedAnswersByQuestion ga /* <-- Changed! */ 
ON ga.UserAnswerId = ua.UserAnswerId 
WHERE ua.UserAnswerId 
IN (
    SELECT MAX(UserAnswerId) AS MostRecentUserAnswer FROM UserAnswersByModule WHERE ModuleId = @ModuleId AND UserId = @UserId AND IsActive = 1 GROUP BY QuestionId 
) 
AND (
    ga.RevisionId is null /* <-- Changed! */ 
    OR ga.RevisionId IN (
    SELECT MAX(RevisionId) AS MostRecentRevisionId 
    FROM GradedAnswersByQuestion GA 
    INNER JOIN UserAnswersByModule 
    ON ga.UserAnswerId = ua.UserAnswerId 
    WHERE UserId = @UserId 
    AND ModuleId = @ModuleId 
    GROUP BY GA.UserAnswerId 
) 
) 
+0

あなたの提案をありがとう、私はあなたのバージョンを試して、私はまだ同じ結果を得ています。格付けテーブルで空の行を含むクエリを実行すると、何も返されません。私は左の結合を試みたが、それ以上は得ることができなかったことに注意したい。 編集 - 実際に私が行った変更の1つを見逃しましたが、もう一度試してみましょう。 – kjstan

+0

私はお詫び申し上げます、あなたの提案が働いた!ありがとうございました! – kjstan

+0

グレート私は別のバージョンを提供するつもりだったが、私はそれが必要ではないと思う! – shawnt00

1

内に定義することにより、最小限の変更でトリック参加ないが接合されている両方のテーブルに含まれている行を返します。左右の結合を見て、あなたの意図する目標に合っているかどうかを確認してください。

0
CREATE PROCEDURE spGetQuestionsAnswersMostRecentUserAnswersAndRevisions 
(
    @UserId char(7), 
    @ModuleId int 
) AS 
SELECT 
    ua.QuestionId, ua.UserAnswerId, 
    UserAnswer, Question, Answer, TypeId, GraderRevision, IsAnswerCorrect 
FROM 
    UserAnswersByModule ua 
    INNER JOIN QuestionsAnswersByModule qa 
     ON qa.QuestionId = ua.QuestionId 
    INNER JOIN GradedAnswersByQuestion ga 
     ON ga.UserAnswerId = ua.UserAnswerId 
    LEFT OUTER JOIN 
    (
     SELECT MAX(RevisionId) AS MostRecentRevisionId 
     FROM GradedAnswersByQuestion GA 
     GROUP BY GA.UserAnswerId 
    ) AS mr_ga 
     ON mr_ga.RevisionId = ga.RevisionId 
WHERE 
    UserId = @UserId AND ModuleId = @ModuleId 
    AND ua.UserAnswerId IN (
     SELECT MAX(UserAnswerId) AS MostRecentUserAnswer 
     FROM UserAnswersByModule 
     WHERE ModuleId = ua.ModuleId AND UserId = ua.UserId AND IsActive = 1 
     GROUP BY QuestionId 
    ) 
0

左結合を入力してフィルタ条件を適用します。

CREATE PROCEDURE   
    spGetQuestionsAnswersMostRecentUserAnswersAndRevisions(@UserId char(7),@ModuleId int) AS 
SELECT ua.QuestionId, ua.UserAnswerId, UserAnswer, Question, Answer, TypeId, GraderRevision,  IsAnswerCorrect 
    FROM UserAnswersByModule ua 
    INNER JOIN QuestionsAnswersByModule qa 
     ON qa.QuestionId = ua.QuestionId 
    LEFT JOIN GradedAnswersByQuestion ga 
     ON ga.UserAnswerId = ua.UserAnswerId 
      AND  ga.RevisionId IN (
      SELECT 
    MAX(RevisionId) AS  MostRecentRevisionId 
    FROM GradedAnswersByQuestion GA 
    INNER JOIN UserAnswersByModule 
     ON ga.UserAnswerId = ua.UserAnswerId 
     WHERE UserId = @UserId 
     AND ModuleId = @ModuleId 
    GROUP BY GA.UserAnswerId 
    ) 
Where ua.UserAnswerId IN (
    SELECT MAX(UserAnswerId) AS  MostRecentUserAnswer 
    FROM UserAnswersByModule 
     WHERE ModuleId = @ModuleId 
     AND UserId =  @UserId 
    AND IsActive = 1 GROUP BY QuestionId 
    ) 
関連する問題