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

Odd INNER JOIN syntaks og indkapsling

Parenteserne ændrer ikke på semantikken. Placeringen af ​​ON klausul styrer rækkefølgen af ​​den logiske behandling af joinforbindelser.

Første forespørgsel

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 

Anden forespørgsel

(Overflødige parenteser fjernet)

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 

logisk i dit første eksempel joinforbindelsen på Transaction, Product sker først, derefter forbindes den virtuelle tabel, der er resultatet af det, til Customer , hvorimod i dit andet eksempel joinforbindelsen på Transaction, Customer sker først, derefter forbindes den virtuelle tabel, der er resultatet af den, til Product

Dette er kun logisk, og da indre joinforbindelser er både associative og kommutative, vil dette sandsynligvis ikke gøre nogen forskel for udførelsesplanen (medmindre du tilføjer OPTION (FORCE ORDER) til forespørgslen), men det kan gøre for ydre joinforbindelser.

Dette er dækket af Itzik Ben Gan her men artiklen har en række unøjagtigheder, se opfølgningsbrevet af Lubor Kollar også.




  1. Hvad er årsagen til transaktionskonteksten, der bruges af en anden session

  2. MySQL-fejl 1118 (rækkestørrelse for stor) ved gendannelse af Django-mailer-database

  3. Hvorfor kan jeg ikke bruge en variabel som tabelnavn i en lagret procedure?

  4. Fejl ved opbygning af program med mysql-stik