Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Ungerade INNER JOIN-Syntax und Kapselung

Die Klammern ändern die Semantik nicht. Die Position des ON -Klausel steuert die Reihenfolge der logischen Verarbeitung von Joins.

Erste Abfrage

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 

Zweite Abfrage

(Überflüssige Klammern entfernt)

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 

Also logisch in Ihrem ersten Beispiel der Join auf Transaction, Product geschieht zuerst, dann wird der daraus resultierende virtuelle Tisch mit Customer verknüpft , während in Ihrem zweiten Beispiel der Join auf Transaction, Customer geschieht zuerst, dann wird der daraus resultierende virtuelle Tisch an Product angefügt

Dies ist nur logisch, und da innere Verknüpfungen sowohl assoziativ als auch kommutativ sind, wird dies wahrscheinlich keinen Unterschied zum Ausführungsplan machen (es sei denn, Sie fügen OPTION (FORCE ORDER) hinzu zur Abfrage), aber es kann für Outer Joins reichen.

Dies wird hier von Itzik Ben Gan behandelt aber der Artikel enthält eine Reihe von Ungenauigkeiten, siehe den Folgebrief von Lubor Kollar auch.