2010-09-17 56 views
4

我是一個新的編寫sql和我有一個關於連接的問題。下面是一個例子選擇:sql加入語法

select bb.name from big_box bb, middle_box mb, little_box lb 
where lb.color = 'green' and lb.parent_box = mb and mb.parent_box = bb; 

所以我們可以說,我正在尋找的所有嵌套的地方在他們裏面一個小盒子,這就是綠色的大箱子的名稱。如果我理解正確,上面的語法是通過使用'join'關鍵字獲得相同結果的另一種方法。

問題:上面的select語句對於它正在執行的任務是否有效?如果不是,有什麼更好的方法來做到這一點?是一個連接的語句語法糖還是它實際上在做其他事情?

如果您有關於該主題的任何優秀材料的鏈接,我很樂意閱讀它,但由於我不確切知道這種技術被稱爲什麼,所以我在使用Google搜索時遇到了麻煩。

回答

12

您正在使用隱式連接語法。這相當於使用JOIN關鍵字,但它是一個好主意,完全避免這種語法,而是使用明確連接:

SELECT bb.name 
FROM big_box bb 
JOIN middle_box mb ON mb.parent_box = bb.id 
JOIN little_box lb ON lb.parent_box = mb.id 
WHERE lb.color = 'green' 

你也缺少連接條件的列名。我猜想這個專欄叫做id

這種類型的查詢應該是有效的,如果表正確索引。特別是在連接條件和little_box.color上應該有外鍵約束。

與您的查詢有關的問題是,如果在一個框中有多個綠色框,您將得到重複的行返回。這些重複項可以通過在SELECT之後添加DISTINCT來刪除。

+0

「隱式」語法是ANSI-89; 「明確」是ANSI-92 – 2010-09-17 00:57:17

+0

徹底的答案,謝謝你的提示。這是sl to離開bb.id(或某物)。確定後續問題:我可以從where子句中的任何表中指定條件嗎?即:WHERE lb.color ='green'和mb.color ='red' – 2010-09-17 04:55:43

+0

此外,隱式連接的搜索結果中,有一些觀察發現隱式連接是「過時的」,這是智者之間的共識嗎? – 2010-09-17 04:56:59