我在终端中使用PostgreSQL 9.5.1。我按照教程。有两个表:“is_called”包含学生的ID和名称,“is_enrolled_on”包含学生注册的课程。我试图创建只返回未注册任何课程的学生的查询。为此,我使用了“不存在”条件但我无法理解为什么没有返回id为5的学生,因为他没有参加任何课程。
也许这是我对“存在”条件的理解是错误的。对我来说,“存在”的作用就像两个关系之间的交集。
答案 0 :(得分:2)
问题是子查询只是在没有连接外部查询的情况下执行。它返回行;因此,NOT EXISTS
为false,不返回任何行。
要掌握这一点,请从NOT IN
开始:
select i.studentid
from is_called i
where i.studentid not in (select io.studentid from is_enrolled_on io);
然后将其转换为NOT EXISTS
:
select i.studentid
from is_called i
where not exists (select 1 from is_enrolled_on io where io.studentid = i.studentid);
我还应注意select distinct
不适用于IN
或EXISTS
。