2012-04-13 64 views
3

我想知道以下查詢(使用兩種不同的聯接語法)之間的區別是什麼。我在一些我繼承的代碼中看到了這一點,並且好奇如果結果總是相同的。如果沒有,爲什麼你會使用一個在另一個。兩個TSQL聯接有什麼區別?

查詢#1實施例:

SELECT * FROM TableA a 
    INNER JOIN TableB b 
    INNER JOIN TableC c 
     ON b.TableBId = c.TableCId 
    ON b.TableBId = a.TableAId 

查詢#2實施例:

SELECT * FROM TableA a 
    INNER JOIN TableB b 
    ON b.TableBId = a.TableAId 
    INNER JOIN TableC c 
    ON b.TableBId = c.TableCId 
+3

看看執行計劃是否有差異。 – 2012-04-13 20:07:44

+0

您確定#1是有效的SQL。根據http://msdn.microsoft.com/en-us/library/ms177634.aspx我看不出如何工作。 – Alex 2012-04-13 20:12:16

+3

@Alex是的,那是有效的SQL。這裏是小提琴顯示沒有執行錯誤:http://sqlfiddle.com/#!3/b00427/1 – 2012-04-13 20:15:13

回答

2

正如已經說過,您可以查看execution plans驗證這些確實是相同的查詢。我幾乎可以肯定,他們是,雖然

更多你的,你爲什麼會選擇一個比其他問題。我會說這歸結於風格偏好。大多數情況下,您會看到#2號查詢,因爲它對未來的讀者有更清晰的定義。如果你創建了一個真正複雜的查詢,那麼你獲得的好處就會大大增加。

我真的不能擔保的其他方法,因爲我真的相信它變得太不可讀和不應該被使用。同樣,這是我的觀點,推論歸結爲意見/風格。

然而,標準的方式是QUERY2,所以我會與堅持:)...但同樣,只是我

+0

「標準方式是query2」 - 兩個查詢都符合SQL標準(並且在語義上相同)。 – onedaywhen 2012-04-16 09:49:18

+0

@onedaywhen標準在行業標準。是的,兩者都是SQL標準版,但很少有開發人員以寫入query1的方式編寫它 – 2012-04-16 16:36:37

0

您的查詢的執行計劃是完全一樣的。