2012-04-11 68 views
1

全部,「LEFT JOIN TableB ON TableA.name = TableB.name」中的「TableB」的任何值?

我在評論一些基本的MySQL JOIN教程。在他的博客傑夫·阿特伍德gives an example認爲是這樣的:

SELECT * FROM TableA 
LEFT OUTER JOIN TableB 
ON TableA.name = TableB.name 

在我看來,該查詢並不需要 - 從語義的角度來看 - 在第二行的TableB提。我理解正確嗎?在我看來,所有的信息已經在第三行中提供了。

我不想攪亂關於SQL語言效率的任何類型的麻煩,我只想了解這種提及TableB是否會在此上下文或其他方面帶來任何新信息。

回答

2

它不會帶來新的信息,但它帶來的精度和能力,爲您別名表:

SELECT a.* FROM TableA a 
LEFT OUTER JOIN TableBWhichHasAReallyLongUnweildyName b 
ON a.name = b.name 

注意,在這一提法,我可以都明確地從a中請求數據並在第3行中更容易地找出連接。但是,除非我明確聲明它,否則編譯器不會有任何非任意指導,無法獲知要使用哪個表的信息。試想,如果這是SQL的方式工作:

SELECT b.* FROM TableA a 
LEFT OUTER JOIN 
ON TableA.name = TableB.name b 
WHERE TableB.value v > 1 

我是不是說,tableB的別名是「B」,或TableB.name的別名是「B」?這只是令人困惑;最好是明確和權威。

2

TableB僅出現在第三行,因爲您加入的列不是唯一命名的。

例如,假設你想加入的列FooBarTableATableB,其中只有TableA有一個叫做Foo ciolumn只有TableB有一列名爲Bar。然後,你可以這樣寫:

SELECT * FROM TableA 
    LEFT OUTER JOIN TableB 
    ON Foo = Bar