所以我有这些表:
学生:学生证 - 姓名 - 姓氏 - 电子邮件
课程:目录ID - 课程名称 - 说明
条款:期限ID - 开始日期 - 结束日期
课程目录:CourseInstance ID - 目录ID - 术语ID
学生课程:StudentCourse ID - CourseInstance ID - 学生ID - 添加到数据库的日期
这样可以很容易地看出哪些学生参加了哪些课程.我不知道该怎么去找出哪些学生没有参加过某一课程.
做这样的事情:
WHERE ((CourseInstances.CatalogLookup)<>504)
我会给我一份学生所选课程的清单,这些课程不等于目录编号504,如下所示:
塔拉 - 501
塔拉 - 502
塔拉 - 505
约翰 - 503
所以例如我已经采用了504.因此我不希望我出现在这个列表中.上面的SQL只会显示我不是504的所有课程,但它不会将我从列表中排除.
有任何想法吗?这可能吗?
我更喜欢这种语法而不是外连接,IMO更容易阅读:
select *
from STUDENTS
where StudentID not in
(
select StudentID
from STUDENTCOURSES s
inner join COURSEINSTANCES c on s.CourseInstanceID = c.CourseInstanceID
where c.CatalogID = 504
)
Run Code Online (Sandbox Code Playgroud)
在嵌套查询中,您选择已参加课程504的所有学生的学生ID.
然后,选择所有StudentID未包含在嵌套查询中的学生.
编辑:
正如ChrisJ已经说过的那样,c和s是表名的别名.
没有它们,查询将如下所示:
select *
from STUDENTS
where StudentID not in
(
select StudentID
from STUDENTCOURSES
inner join COURSEINSTANCES on STUDENTCOURSES.CourseInstanceID = COURSEINSTANCES.CourseInstanceID
where CatalogID = 504
)
Run Code Online (Sandbox Code Playgroud)
我总是使用别名,因为:
a)我太懒了,不必经常输入表名.
b)在我看来,它更容易阅读,特别是当您连接具有长名称的表时.