2017-02-12 38 views
0

我正在閱讀數據庫系統概念由漢克Korth.The書陳述以下給出了所有學生誰已採取所有課程 在生物系提供列表。混淆與空關係測試使用'不退出'

select distinct S.ID, S.name 
from student as S 
where not exists (
     (
      select course id 
      from course 
      where dept name = 'Biology' 
      )   
     except   
     (
      select T.course id 
      from takes as T 
      where S.ID = T.ID 
      ) 
     ); 

student(ID, name, dept name, tot cred) 
course(course id, title, dept name, credits) 
takes(ID, course id, sec id, semester, year, grade) 

但是,我的理解,最後的子查詢發現誰是服用至少一門課程的所有學生,並通過從第一子查詢做減,我們減去當前採取的同學們都生物學課程,所以我們將留下任何學生都沒有參加的生物課程(如果有的話)。然後,當我們對所有學生的ID都「不存在」時,我們正在尋找沒有參加那些發現的生物課程以及他們可以參加的學生ID除了生物學以外的任何課程。但是這並不包括正在接受生物系所有課程的學生名單。請給予解釋? 請注意:我確實瞭解如果'不存在',使用this 網站,但我沒有得到這本書的例子。

+0

請修改您的帖子並**刪除**不適用於您的問題的標籤('mysql','oracle')。你真的**使用哪種數據庫系統? – mathguy

+0

oracle開發人員 –

回答

1

我想你缺少的是NOT EXISTS子查詢獨立執行,對於每個行由外部查詢返回。

請注意,它的一個相關聯的子查詢。有一個引用來自外部查詢S.ID的列。

對於子查詢的每次執行,都會傳入一個值S.ID。因此,如果學生正在接受生物系的所有課程,子查詢中的EXCEPT操作將導致一個空集。 NOT EXISTS將評估爲TRUE。但是如果子查詢返回一行,那麼至少有一門生物課程是學生沒有采用的。