2014-10-17 24 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