Ich schreibe eine Abfrage, um Informationen zu allen Fragen zu einem Quiz auszuwählen (ModuleId
). Ich brauche die letzte Benutzerantwort, zusammen mit der Frage, dem Antwortschlüssel und den Informationen für den Schüler, falls vorhanden.Keine Zeilen ausgewählt, wenn die Tabelle im Join keine Zeile enthält
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)
Dies ist, wie die Tabellen eingerichtet sind:
QuestionAnswersByModule:
PK - QuestionId
UserAnswersByModule:
PK - UserAnswerId
FK - QuestionAnswersByModule.QuestionId
GradedAnswersByQuestion:
PK - RevisionId
FK - UserAnswersByModule.UserAnswerId
Das Problem mit meiner Anfrage ist, dass, wenn es in GradedAnswersByQuestion
für die jeweiligen UserAnswerId
nichts ist, die Abfrage gar nichts zurückzugibt, statt null für diese beiden Spalten und den Rest die Information. Ich bin mir ziemlich sicher, dass es wegen der AND ga.RevisionId IN ...
ist, aber ich kann mir nicht vorstellen, wie ich es sonst schreiben könnte. Jede Hilfe wäre willkommen.
Vielen Dank für Ihren Vorschlag, ich habe Ihre Version versucht und ich bekomme immer noch die gleichen Ergebnisse. Wenn ich die Abfrage mit leeren Zeilen in der abgestuften Tabelle ausführe, wird nichts zurückgegeben. Ich wollte feststellen, dass ich Links Joins versucht habe, aber nicht weiter kommen konnte. Bearbeiten - Eigentlich habe ich eine der Änderungen verpasst, lassen Sie mich es erneut versuchen und ich werde Sie wissen lassen, ob es funktioniert. – kjstan
Ich entschuldige mich, Ihr Vorschlag hat funktioniert! Vielen Dank! – kjstan
Ok. Großartig, ich würde eine andere Version anbieten, aber ich denke, das wird nicht nötig sein! – shawnt00