PostgreSQL:麻烦理解存在条件

时间:2016-05-18 14:26:48

标签: sql postgresql exists

我在终端中使用PostgreSQL 9.5.1。我按照教程。有两个表:“is_called”包含学生的ID和名称,“is_enrolled_on”包含学生注册的课程。我试图创建只返回未注册任何课程的学生的查询。为此,我使用了“不存在”条件但我无法理解为什么没有返回id为5的学生,因为他没有参加任何课程。

也许这是我对“存在”条件的理解是错误的。对我来说,“存在”的作用就像两个关系之间的交集。

Description of the queries in the terminal

1 个答案:

答案 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不适用于INEXISTS