使用“不存在”与空关系测试混淆
Posted
技术标签:
【中文标题】使用“不存在”与空关系测试混淆【英文标题】:confusion with empty relations test using 'not exitst' 【发布时间】:2017-02-12 03:16:54 【问题描述】:我正在阅读 Hank Korth 的数据库系统概念。这本书指出以下列出了所有参加过所有课程的学生 在生物系。
select distinct S.ID, S.name
from student as S
where not exists (
(
select course id
from course
where dept name = 'Biology'
)
except
(
select T.course id
from takes as T
where S.ID = T.ID
)
);
student(ID, name, dept name, tot cred)
course(course id, title, dept name, credits)
takes(ID, course id, sec id, semester, year, grade)
但是,据我了解,最后一个子查询会找到所有至少上一门课程的学生,并且通过从第一个子查询中减去,我们会减去学生当前上的所有生物学课程,所以我们将剩下没有任何学生参加的生物学课程(如果有的话)。然后,当我们的所有学生证“不存在”时,我们正在寻找没有参加那些找到的生物学课程的学生证,而且他们可以参加除生物学。但这并没有给出正在参加生物学系所有课程的学生名单。有人可以解释一下吗? 请注意:如果“不存在”来自this,我确实了解其用途 网站,但我没有得到书的例子。
【问题讨论】:
请编辑您的帖子并删除标签(mysql
、oracle
)不适用于您的问题。您真正使用什么数据库系统?
【参考方案1】:
我认为您缺少的是 NOT EXISTS 子查询独立执行,对于外部查询返回的 每个 行。
注意它是一个 correlated 子查询。有来自外部查询S.ID
的列的引用。
每次执行子查询时都会传入一个 S.ID
值。因此,如果学生正在学习生物系的所有课程,则子查询中的EXCEPT
操作将导致一个空集。 NOT EXISTS 将评估为 TRUE。但是如果子查询返回一行,那么至少有一个学生没有参加的生物学课程。
【讨论】:
以上是关于使用“不存在”与空关系测试混淆的主要内容,如果未能解决你的问题,请参考以下文章