我的想法是,我需要列出所有从未失败的学生,这包括尚未参加任何考试的学生 . 几点:
studentId
是学生的唯一身份证件 .studentLastname
显然是学生的姓 .examEntryStudentId
是学生唯一的ID外键 .examEntryNumber
是学生的唯一考试号码 .examInfoNumber
是相同的,但在 ExamInfo
表上 .examInfoPassed
确定学生是否通过,1表示他们通过(超过50%),0表示他们失败 .
我的想法是,我遍历表格从 Student
到 ExamEntry
到 ExamInfo
. 我希望所有的学生首先可能被选为那些年龄较小的学生尚未参加官方考试,所以我正在使用 LEFT JOIN
以便所有学生都被选中,因为他们不会出现因为他们不是由于并非所有学生都参加考试,因此包含在 examEntryStudentId
内 . 此外,然后使用 ExamEntry
表遍历 ExamInfo
表,其中存储了学生是否通过考试的数据 . 这些数据存储在 examInfoPassed
下,因此如果学生在 examInfoPassed
中曾经拥有 0
的值,则意味着他们应该是未包含在我的输出中的唯一学生 .
这是我的初始代码:
SELECT DISTINCT l.studentId, l.studentLastname
FROM Students l
LEFT JOIN ExamEntry e
ON l.studentId = e.examEntryStudentId
JOIN ExamInfo a
ON e.examEntryNumber = a.examInfoNumber
WHERE NOT a.examInfoPassed = 0
;
虽然我的输出目前是通过测试的任何学生,包括之前未通过考试的学生 . 我不确定如何创建一个条件,这意味着如果你属于 NOT a.examInfoPassed = 0
的类别,那么它们将从输出中删除 . 未参加任何测试的学生也不包括在我的输出中 .
2 回答
根据您的sql代码,目前您的查询报告所有至少通过考试的学生,而您希望那些通过所有考试的学生 . 此外,从未通过任何考试的学生将被排除,因为
WHERE
子句引用来自JOINed表的列 .你需要改变你的逻辑:
使用
LEFT JOIN
来检测至少一次考试失败的人然后在
WHERE
子句中排除它们(与此同时,这将允许从未参加过考试的学生被列入输出列表) .查询:
改为使用聚合: