Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Sintaxe e encapsulamento Odd INNER JOIN


Os parênteses não alteram a semântica. A posição do ON cláusula controla a ordem do processamento lógico de junções.

Primeira consulta

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 

Segunda consulta


(Parênteses redundantes removidos)
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 

Então logicamente em seu primeiro exemplo, a junção em Transaction, Product acontece primeiro, então a tabela virtual resultante disso é unida ao Customer , enquanto no seu segundo exemplo a junção em Transaction, Customer acontece primeiro, então a tabela virtual resultante disso é unida ao Product

Isso é apenas logicamente e como as junções internas são associativas e comutativas, isso provavelmente não fará diferença no plano de execução (a menos que você adicione OPTION (FORCE ORDER) para a consulta), mas pode fazer para junções externas.

Este é coberto por Itzik Ben Gan aqui mas o artigo tem várias imprecisões, veja a carta de acompanhamento de Lubor Kollar também.