我只是SQL的初學者,而且我遇到了無法解決的問題。連接4個表
的問題如下:
我有四張桌子
Student: matrnr, name, semester, start_date
Listening: matrnr<Student>, vorlnr<Subject>
Subject: vorlnr, title, sws, teacher<Professor>
Professor: persnr, name, rank, room
我需要列出所有正在聽一些教授與薩莫名稱問題的學生。
編輯:
select s.*
from Student s, Listening h
where s.matrnr=h.matrnr
and h.vorlnr in (select v.vorlnr from Subject v, Professor p
where v.gelesenvon=p.persnr and p.name='Kant');
這是我如何解決它,但我不知道是不是最佳的解決方案。
第一次看,我更喜歡EXISTS的變體,但正如我在Oracle上看到的,IN和EXISTS在這種情況下都會生成相同的計劃。 – 2014-11-08 16:38:34
@VDohnal:因爲IN和EXISTS會做同樣的事情。特別是在Oracle中,它甚至可以處理像「where(a,b)in(select ...)」這樣的元組,而許多其他dbms不需要。再次,無論選擇IN還是EXISTS,都是一個品味問題。我經常選擇IN;也許是因爲我傾向於分組思考。 – 2014-11-08 17:11:51
'IN'和'EXISTS'非常相似,但它們並不相同 - 不僅在性能方面。當數據包含「NULL」值時,您可以得到不同的結果。在這裏看到一些解釋:[瞭解空值如何影響IN和EXISTS](http://www.techrepublic.com/article/oracle-tip-understand-how-nulls-affect-in-and-exists/)或谷歌的' oracle差異和存在空' – 2014-11-09 08:39:08