Le parentesi non cambiano la semantica. La posizione del ON
La clausola controlla l'ordine dell'elaborazione logica dei join.
Prima richiesta
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
Seconda richiesta
(parentesi ridondanti rimosse)
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
Quindi logicamente nel tuo primo esempio il join su Transaction, Product
avviene prima poi la tabella virtuale che ne risulta viene unita a Customer
, mentre nel tuo secondo esempio il join su Transaction, Customer
avviene prima poi la tabella virtuale che ne risulta viene unita a Product
Questo è solo logicamente e poiché gli inner join sono sia associativi che commutativi, questo probabilmente non farà alcuna differenza per il piano di esecuzione (a meno che tu non aggiunga OPTION (FORCE ORDER)
alla query) ma può funzionare per gli outer join.
Questo è trattato da Itzik Ben Gan qui ma l'articolo presenta una serie di imprecisioni, vedere la lettera di follow-up di Lubor Kollar anche.