列出表中所有需要的记录,即使连接的表包含 NULL
Posted
技术标签:
【中文标题】列出表中所有需要的记录,即使连接的表包含 NULL【英文标题】:Listing all desired records from a table even if the joined table contains NULLs 【发布时间】:2017-06-29 18:23:59 【问题描述】:获取 QuizQuestions 表中特定测验的所有问题。
从 ClassStudents 表中获取特定班级的所有学生。
从 StudentAnswers 表中获取特定测验的所有学生回答。仅存储学生在测验中回答的问题的记录。
所以我写了这个:
SELECT cs.lastName, qq.questionStem, ISNULL(sa.selectedAnswer, 'Did not answer') AS Answer
FROM StudentAnswers sa
right join QuizQuestions qq ON qq.questionId = sa.questionId
right join ClassStudents cs ON sa.studentID = cs.studentID
WHERE qq.quizID = 12345
AND cs.classID = 500
ORDER BY lastName
它确实会获取数据,但如果学生没有回答特定问题或参加测验,我只会得到他们的姓氏,但 questionStem 的值为 NULL。
但我想查看他们没有回答的问题的 questionStem。
查看我的查询,我可以看到为什么我得到一个 NULL。这是因为如果学生从未回答过问题,StudentAnswers 表中就没有条目。
有没有办法重新编写查询,以便显示每个问题的主干,即使学生从未回答过?
我试图得到这样的结果:
lastName questionStem Answer
--------------------------------------------------------
Smith Favorite color? Black
Jones Favorite color? Did not answer
Aki Favorite color? Red
Smith Your age? 22
Jones Your age? 71
Aki Your age? Did not answer
【问题讨论】:
当学生没有回答问题时,您希望如何获得学生姓名作为答案?在我看来,你的设计有问题。你可能应该把你的答案分成两张表。一个用于保存标题详细信息,例如学生信息、测验编号、开始日期等。第二个表格用于保存他们对每个问题的回答。 【参考方案1】:试试这个
SELECT cs.lastName, qq.questionStem, ISNULL(sa.selectedAnswer, 'Did not answer') AS Answer
FROM StudentAnswers sa
FULL JOIN QuizQuestions qq ON qq.questionId = sa.questionId
FULL JOIN ClassStudents cs ON cs.studentID = sa.studentID
WHERE qq.quizID = 12345
AND cs.classID = 500
ORDER BY lastName
参考:SQL Server FULL Joins
【讨论】:
以上是关于列出表中所有需要的记录,即使连接的表包含 NULL的主要内容,如果未能解决你的问题,请参考以下文章
访问查询以包含所有记录,即使一个字段缺少数据(为 Null)