两个sql代码有什么不同?

时间:2014-10-17 15:34:09

标签: sql exists

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_idcourse是否属于section。如果exists返回true,那么之前检查过的course_idcourse_id被选中。

3 个答案:

答案 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