2016-04-30 44 views
0

我正在讀一本關於SQL的書,我被困在一個與數據庫模式相關的例子中,如下圖所示。 THE DATABASE SCHEMA將WHERE子句與NATURAL JOIN SQL一起使用?

下面的例子解決了在書中指出查詢:「用的課程,他們教的冠軍一起列出導師 的名字」

假設我們希望回答查詢的查詢可以寫在 SQL如下:

select name , title 
from instructor natural join teaches , course 
where teaches.course id = course.course id; 

現在書指出

「需要注意的是teaches.course ID 在其中CL ause引用自然連接結果的course id字段,因爲該字段又來自教授關係。 「

再次在書中狀態BOLD說:

」這是不可能的使用屬性包含原始關係名稱的名稱,例如instructor.name或teaches.course ID,是指屬性的自然加入結果;但是,我們可以使用屬性名稱,如 名稱和課程ID,但不包含關係名稱。「

(請參閱上面的查詢)如果不可能,那麼作者如何能夠將查詢寫爲

teaches.course id = course.course id 

如何teaches.course指自然連接屬性「場」中,筆者已經隱約這樣提出他的arguments.Please給我解釋一下作者的觀點。

+0

SQL Server不支持'NATURAL JOIN',所以問題不能與該數據庫有關。 –

+0

問題是關於sql語言的一般問題,而不是關於sql server的問題。我剛剛用它作爲附加標籤。 –

+2

'從教練自然結合教',課程'我會說:燒書! 「自然加入」通常被認爲是邪惡的,並且與舊式的通用結合在一起,這是無法承認的。 – wildplasser

回答

5

忽略什麼書有要說NATURAL JOIN。只要避免它。NATURAL JOIN是一個等待發生的錯誤。爲什麼?T他只是通過在表中的列上命名約定來定義連接鍵 - 使用碰巧具有相同名稱的任何列。其實,NATURAL JOIN忽略了正確定義的FOREIGN KEY關係;並且它們隱藏了實際用於匹配的鍵。

因此,請明確指出,並使用ONUSING子句代替。這些都清楚地說明了使用的密鑰,並且代碼更易於理解和維護。

然後,遵循一個簡單的規則:永不FROM子句中使用逗號; 始終使用使用明確的JOIN語法。

所以,寫您的查詢的好辦法是這樣的:

select i.name, c.title 
from instructor i inner join 
    teaches t 
    on t.instructor_id = i.instructor_id inner join 
    course c 
    on t.course_id = i.course_id; 

注意,沒有where條款,所有列都是合格的,這意味着他們指定他們都來自該表。

此外,我沒有在teaches表中看到instructor_id列,所以這只是合理代碼的一個例子。

+0

非常感謝你 –