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.