Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Odd INNER JOIN syntaxe et encapsulation

Les parenthèses ne changent pas la sémantique. La position du ON La clause contrôle l'ordre du traitement logique des jointures.

Première requête

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 

Deuxième requête

(Parenthèses redondantes supprimées)

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 

Donc logiquement dans votre premier exemple la jointure sur Transaction, Product se produit d'abord, puis la table virtuelle qui en résulte est jointe à Customer , alors que dans votre deuxième exemple la jointure sur Transaction, Customer se produit en premier, puis la table virtuelle qui en résulte est jointe à Product

Ce n'est que logique et comme les jointures internes sont à la fois associatives et commutatives, cela ne fera probablement aucune différence dans le plan d'exécution (sauf si vous ajoutez OPTION (FORCE ORDER) à la requête) mais cela peut faire pour les jointures externes.

Ceci est couvert par Itzik Ben Gan ici mais l'article contient un certain nombre d'inexactitudes, voir la lettre de suivi de Lubor Kollar aussi.