Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Sintassi e incapsulamento dispari di INNER JOIN

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.