2014-12-02 76 views
2
Select book_id,title 
from Publisher 
natural join Book natural join Category 
where Publisher.name='thomas hardy' AND Category.name='computer science'; 
+1

這太糟糕了?你有問題嗎? – 2014-12-02 21:21:55

+0

你爲什麼使用'NATURAL JOIN'?這裏有什麼要求? – tadman 2014-12-02 21:21:58

+0

我需要獲取特定發佈商和類別的所有圖書標題,以便從表中搜索這兩個id,然後將其與書籍表加入以查找書籍,是否應該不使用自然聯接? – user3600154 2014-12-02 21:24:54

回答

2

只是爲了避免natural join。它會查找相同的列,並且您可能會錯過某處。例如,我創建的幾乎所有表都有一個CreatedAt列。那會導致NATURAL JOIN失敗。

相反,包括USING條款或明確ON

Select book_id,title 
from Publisher join 
    Book 
    using (Publisher_Id) join 
    Category 
    using (Category_Id) 
where Publisher.name = 'thomas hardy' AND Category.name = 'computer science'; 

事實上,謎團解開。 NATURAL JOIN將嘗試使用name作爲關鍵。而且,我猜測沒有任何發佈商擁有與某個類別名稱完全匹配的名稱。

0

如果您使用自然聯接,這意味着您的表將加入共享相同名稱的字段。您的Publisher表格和您的類別表中的一個字段是Name,這意味着自然連接將加入這些字段。

然後按不同的標準過濾兩個字段。兩個表連接後,兩個字段中的值不能相同。

這將類似於寫作:

Select foo FROM bar WHERE foo="something" and foo="Something Else" 

這是沒有意義的。自然連接很好,所有的,但你幾乎總是明白你的JOIN標準,即使它感覺有點多餘。畢竟...代碼中的註釋通常是多餘的,但只有一個不能使它們成爲的東西。