Odd INNER JOIN syntax and encapsulation

前端 未结 1 1463
暗喜
暗喜 2020-12-11 19:09

I\'m usually pretty well versed with JOINS, but this is new.

Suppose three tables (classic case of two tables and a third, linker table):

Customer  Produc         


        
1条回答
  •  醉梦人生
    2020-12-11 19:58

    The parentheses do not change the semantics. The position of the ON clause controls the order of the logical processing of joins.

    First Query

    SELECT Customer.Name,
           Product.Desc,
           Transaction.Date
    FROM   Product
           INNER JOIN Transaction
             ON Transaction.ProductID = Product.ID
           INNER JOIN Customer
             ON Transaction.CustomerID = Customer.ID 
    

    Second Query

    (Redundant parentheses removed)

    SELECT Customer.Name,
           Product.Desc,
           Transaction.Date
    FROM   Product
           INNER JOIN Transaction
                      INNER JOIN Customer
                        ON Transaction.CustomerID = Customer.ID
             ON Transaction.ProductID = Product.ID 
    

    So logically in your first example the join on Transaction, Product happens first then the virtual table resulting from that is joined onto Customer, whereas in your second example the join on Transaction, Customer happens first then the virtual table resulting from that is joined on to Product

    This is only logically and as inner joins are both associative and commutative this likely won't make any difference to the execution plan (unless you add OPTION (FORCE ORDER) to the query) but it can do for outer joins.

    This is covered by Itzik Ben Gan here but the article has a number of inaccuracies, see the follow up letter by Lubor Kollar as well.

    0 讨论(0)
提交回复
热议问题