我的想法是,我需要列出所有从来没有失败过的学生,这包括学生还没有参加任何考试。有几点: studentId
是学生的唯一id。 studentLastname
显然是学生的姓。 examEntryStudentId
是学生的唯一id外键。 examEntryNumber
是学生的唯一考试编号。 examInfoNumber
是相同的,但在 ExamInfo
table。 examInfoPassed
确定学生是否通过,1表示通过(超过50%),0表示不及格。
我的想法是从 Student
至 ExamEntry
至 ExamInfo
. 我希望所有的学生首先可能被选中,因为那些年轻的学生还没有参加正式的考试,所以我正在利用 LEFT JOIN
因此,所有被选中,否则它们不会出现,因为它们不包含在 examEntryStudentId
因为不是所有的学生都参加了考试。此外,您还可以使用 ExamEntry
要遍历到 ExamInfo
存储学生是否考试不及格数据的表。此数据存储在 examInfoPassed
如果一个学生曾经拥有 0
在 examInfoPassed
这意味着他们应该是唯一的学生不包括在我的输出。
这是我的初始代码:
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条答案
按热度按时间dsf9zpds1#
改为使用聚合:
k75qkfdt2#
根据您的sql代码,当前您的查询报告至少通过了考试的所有学生,而您需要通过所有考试的学生。此外,从未通过任何考试的学生也被排除在外,因为
WHERE
子句引用来自联接表的列。你需要改变你的逻辑:
使用
LEFT JOIN
检测那些至少一次考试不及格的人然后将它们排除在
WHERE
子句(同时,这将允许从未参加过考试的学生被包括在输出列表中)。查询: