sql >> Databasteknik >  >> RDS >> Sqlserver

Udda INNER JOIN syntax och inkapsling

Parentesen ändrar inte semantiken. Positionen för ON klausul styr ordningen för logisk bearbetning av kopplingar.

Första frågan

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 

Andra fråga

(Redundanta parenteser har tagits bort)

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 

logiskt i ditt första exempel, gå med på Transaction, Product händer först, sedan kopplas den virtuella tabellen som är resultatet av den till Customer , medan det i ditt andra exempel går med på Transaction, Customer händer först, sedan kopplas den virtuella tabellen som är resultatet av den till Product

Detta är bara logiskt och eftersom inre kopplingar är både associativa och kommutativa kommer detta sannolikt inte att göra någon skillnad för exekveringsplanen (såvida du inte lägger till OPTION (FORCE ORDER) till frågan) men det kan göra för yttre kopplingar.

Detta bevakas av Itzik Ben Gan här men artikeln har ett antal felaktigheter, se uppföljningsbrevet av Lubor Kollar likaså.




  1. Hitta N närmaste linjesträng från en punkt med MySQL Spatial Extensions

  2. PostgreSQL Composite Primärnyckel och seriell ökning?

  3. Skapa sekvens av datum och tid

  4. Skillnaden mellan LIKE och ~ i Postgres