2010-03-31 117 views
0

我對評估joins.The查詢SQL Server如何sql服務器如何評估多個不同的聯接?

SELECT * 
FROM TableA 
INNER JOIN TableB ON TableB.id = TableA.id 
LEFT JOIN TABLEC ON TABLEC.id = TABLEB.id 

Q1一般性的問題:是LEFT JOIN基於什麼表?我知道它將基於TABLEC,但另一個是什麼?它是在左連接條件中指定的第一個內部連接還是TABLEB的結果?

Q2:是 「LEFT JOIN表C ON TABLEC.id = TABLEB.id」 等同於 「LEFT JOIN表C ON TABLEB.id = TABLEC.id」

Q3:是等效於以下一個查詢? (TABLEB.id替換TABLEA.id?)

SELECT * 
FROM TableA 
INNER JOIN TableB ON TableB.id = TableA.id 
LEFT JOIN TABLEC ON TABLEC.id = TABLEA.id 

謝謝!

回答

2

Q1:它基於內連接的結果,因此它只會與表A和表B中的項目左連接。

Q2:是

問題3:是的,這是問題Q1的結果。

1

SQL是一種聲明性語言。當你聲明'A JOIN B JOIN C'時,沒有參與的順序。最終結果必須符合所需的標準,但底層實現可以自由選擇任何實際的實現順序。

在邏輯層面上,內部JOIN運算符爲associative,所以順序無關緊要:'A JOIN B JOIN C'與'A JOIN C JOIN B'相同,與'B JOIN A JOIN C'相同。等等等等。

+0

但你的解釋似乎是說交換而不是聯想。 – zsong 2010-03-31 16:35:20

+0

@ziang:你說得對。我應該解釋一個JOIN(B JOIN C)與(A JOIN B)JOIN C相同,其中括號表示評估順序,而不是子查詢。 – 2010-03-31 17:41:40