列出表中所有需要的记录,即使连接的表包含 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的主要内容,如果未能解决你的问题,请参考以下文章

一张图看懂Mysql的join连接

访问查询以包含所有记录,即使一个字段缺少数据(为 Null)

SQL:连接两个表 - 结果表应列出所有 ID(即使是那些不在连接表中的 ID)

数据库操作中,左连接,右连接是啥意思,举例说明

mysql获取条件中描述的所有记录,即使表中不存在

在 MS Access 中,如何以多对多关系列出记录,以使所列出的表中的记录不重复?