1
select course_id
from course
where exists
(select course_id
from course
where course_id not in
(select course_id
from section));
2
select course_id
from course
where course_id not in
(select course_id
from section);
我想检索表course_id
中未显示在表course
中的每个section
。第一个结果是200;第二个结果是115。
为什么两者有不同的结果?
我首先解释的是,我将检查course_id
中course
是否属于section
。如果exists返回true,那么之前检查过的course_id
是course_id
被选中。
答案 0 :(得分:3)
来自docs:
If a subquery returns any rows at all, EXISTS subquery is TRUE, and NOT EXISTS subquery is FALSE
所以在你的情况下,第一个查询返回所有行看起来像
的行select course_id from course where TRUE;
因此,如果您想要检索表格课程中未出现在表格部分中的每个course_id您的第二个查询是正确的。
关于那个:
我解释了第一个我将检查是否存在course_id当然不属于section。如果exists返回true,那么之前检查过的course_id是选择了course_id。
这是错误的解释: Reference to docs
答案 1 :(得分:1)
您的第一个查询只返回所有课程,因为115个课程总是EXIST
不在部分表中。因此,EXIST
子句始终为真。
为了显示差异,以下查询应该返回115行作为第二行。但你的第二个肯定更有效率。
select c1.course_id
from course c1
where exists
(select c2.course_id
from course c2
where c1.course_id = c2.course_id
and c2.course_id not in
(select course_id
from section));
请参阅this fiddle。
答案 2 :(得分:0)
@ X.L.Ant的解释很好。你也可以用这种方式做你需要的事情:
select
course_id
from course
except all -- just exclude all id's from second select
select
course_id
from section