sql >> Databáze >  >> RDS >> Sqlserver

Odd INNER JOIN syntaxe a zapouzdření

Závorky nemění sémantiku. Pozice ON klauzule řídí pořadí logického zpracování spojení.

První dotaz

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 

Druhý dotaz

(Byly odstraněny nadbytečné závorky)

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 

Tedy logicky ve vašem prvním příkladu spojení na Transaction, Product nejprve se stane, pak se virtuální tabulka, která z toho vznikne, připojí k Customer , zatímco ve vašem druhém příkladu spojení na Transaction, Customer nejprve se stane, pak se virtuální tabulka, která je výsledkem toho, připojí k Product

To je pouze logické a protože vnitřní spojení jsou jak asociativní, tak komutativní, pravděpodobně to nebude mít žádný vliv na plán provádění (pokud nepřidáte OPTION (FORCE ORDER) na dotaz), ale může to udělat pro vnější spojení.

Toto obsahuje Itzik Ben Gan zde ale článek obsahuje řadu nepřesností, viz navazující dopis Lubora Kollára také.




  1. Vytvoření testu rozšíření v postgresql

  2. Problém s použitím ROW_NUMBER() OVER (PARTITION BY...)

  3. Jak najít datum 48 pracovních hodin kromě soboty, neděle a svátků v oracle

  4. Vnitřnosti transakční replikace serveru SQL – část 2