SQL问题:告诉我没有参加过某一课程的学生?

Tar*_*ara 3 sql ms-access

所以我有这些表:

学生:学生证 - 姓名 - 姓氏 - 电子邮件

课程:目录ID - 课程名称 - 说明

条款:期限ID - 开始日期 - 结束日期

课程目录:CourseInstance ID - 目录ID - 术语ID

学生课程:StudentCourse ID - CourseInstance ID - 学生ID - 添加到数据库的日期

这样可以很容易地看出哪些学生参加了哪些课程.我不知道该怎么去找出哪些学生没有参加过某一课程.

做这样的事情:

WHERE ((CourseInstances.CatalogLookup)<>504)

我会给我一份学生所选课程的清单,这些课程不等于目录编号504,如下所示:

塔拉 - 501

塔拉 - 502

塔拉 - 505

约翰 - 503

所以例如我已经采用了504.因此我不希望我出现在这个列表中.上面的SQL只会显示我不是504的所有课程,但它不会将我从列表中排除.

有任何想法吗?这可能吗?

Chr*_*cht 9

我更喜欢这种语法而不是外连接,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)在我看来,它更容易阅读,特别是当您连接具有长名称的表时.