2014-10-17 27 views
0

1.这两个sql代码有什么不同?

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没有出现在表sectioncourse_id。第一个结果在200;第二个结果在115. 为什么这两个有不同的结果?

我解释第一个,我将检查course中是否有course_id不属于section。如果存在返回true,那么之前检查的course_idcourse_id所选。

回答

3

从文档:

If a subquery returns any rows at all, EXISTS subquery is TRUE, and NOT EXISTS subquery is FALSE 

所以你的情况,第一个查询返回的所有行casue它会看起来像

select course_id from course where TRUE; 

所以,如果你想检索表当然,这并不每一COURSE_ID出现在表格部分您的第二个查询是正确的。

以及有关:

我解释:第一,我会检查是否有在当然,这并不属于部分COURSE_ID。如果exists返回true,那么之前检查过的course_id是选择的course_id。

这是错误的解释: Reference to docs

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

0

的解释由@ X.L.Ant是好的。你也可以做你需要的这种方式:

select 
    course_id 
from course 
except all -- just exclude all id's from second select 
select 
    course_id 
from section