Použití vnitřních spojení

Dokončeno

Nejčastějším typem JOIN v dotazech T-SQL je INNER JOIN. Vnitřní spojení se používají k řešení mnoha běžných obchodních problémů, zejména v prostředích s vysoce normalizovanou databází. Pokud chcete načíst data uložená v několika tabulkách, budete je často muset zkombinovat prostřednictvím dotazů INNER JOIN. Funkce INNER JOIN zahájí svou logickou fázi zpracování jako kartézský součin, který se pak vyfiltruje a odebere všechny řádky, které neodpovídají predikátu.

Zpracování INNER JOIN

Pojďme se podívat na kroky, podle kterých BUDE SQL Server logicky zpracovávat dotaz JOIN. Čísla řádků v následujícím hypotetickém příkladu jsou přidána pro přehlednost:

1) SELECT emp.FirstName, ord.Amount
2) FROM HR.Employee AS emp 
3) JOIN Sales.SalesOrder AS ord
4)      ON emp.EmployeeID = ord.EmployeeID;

Jak byste měli vědět, klauzule FROM se zpracuje před klauzulí SELECT. Pojďme sledovat zpracování počínaje řádkem 2:

  • Klauzule FROM určuje personální oddělení . Employee table as one of the input tables, giving it the alias emp.
  • Operátor JOIN na řádku 3 odráží použití INNER JOIN (výchozí typ v T-SQL) a určuje Sales.SalesOrder jako druhou vstupní tabulku, která má alias ord.
  • SQL Server provede u těchto tabulek logické kartézské spojení a výsledky předá jako virtuální tabulku dalšímu kroku. (Fyzické zpracování dotazu nemusí ve skutečnosti provádět kartézské operace produktu v závislosti na rozhodnutí optimalizátoru. Ale může být užitečné si představit kartézský produkt, který se vytváří.)
  • Pomocí klauzule ON SQL Server vyfiltruje virtuální tabulku a zachová pouze ty řádky, ve kterých hodnota EmployeeID z tabulky emp odpovídá ID zaměstnance v ord tabulce.
  • Zbývající řádky zůstanou ve virtuální tabulce a předají se dalšímu kroku příkazu SELECT. V tomto příkladu je virtuální tabulka dále zpracována klauzulí SELECT a dva zadané sloupce se vrátí do klientské aplikace.

Výsledkem dokončeného dotazu je seznam zaměstnanců a jejich množství objednávek. Zaměstnanci, kteří nemají přidružené objednávky, byly vyfiltrovány klauzulí ON, protože všechny objednávky, ke kterým dojde, mají ID zaměstnance, které neodpovídá položce v personálním oddělení. Tabulka zaměstnanců

A Venn diagram showing the matching members of the Employee and SalesOrder sets

Syntaxe INNER JOIN

Funkce INNER JOIN je výchozí typ JOIN a volitelné klíčové slovo INNER je implicitní v klauzuli JOIN. Při kombinování a porovnávání typů spojení může být užitečné explicitně určit typ spojení, jak je znázorněno v tomto hypotetickém příkladu:

SELECT emp.FirstName, ord.Amount
FROM HR.Employee AS emp 
INNER JOIN Sales.SalesOrder AS ord
    ON emp.EmployeeID = ord.EmployeeID;

Při psaní dotazů pomocí vnitřních spojení zvažte následující pokyny:

  • U aliasů tabulky se upřednostňuje nejen pro seznam SELECT, ale také pro zápis klauzule ON.
  • Vnitřní spojení se můžou provádět v jednom odpovídajícím sloupci, jako je například ORDERID, nebo u více odpovídajících atributů, jako je například kombinace IDobjednávek a IDproduktu. Spojení, která určují více odpovídajících sloupců, se nazývají složené spojení.
  • Pořadí, ve kterém jsou tabulky uvedeny v klauzuli FROM pro INNER JOIN, nezáleží na optimalizátoru SQL Serveru. Koncepčně se spojení vyhodnotí zleva doprava.
  • Klíčové slovo JOIN použijte jednou pro každou dvojici spojených tabulek v seznamu FROM. Pro dotaz se dvěma tabulkami zadejte jedno spojení. Pro dotaz se třemi tabulkami použijete funkci JOIN dvakrát; mezi prvními dvěma tabulkami a znovu mezi výstupem funkce JOIN mezi prvními dvěma tabulkami a třetí tabulkou.

Příklady INNER JOIN

Následující hypotetický příklad provede spojení s jedním odpovídajícím sloupcem, který se vztahuje ProductModelID v tabulce Production.Product k ProductModelID v tabulce Production.ProductModel v tabulce Production.ProductModel:

SELECT p.ProductID, m.Name AS Model, p.Name AS Product
FROM Production.Product AS p
INNER JOIN Production.ProductModel AS m
    ON p.ProductModelID = m.ProductModelID
ORDER BY p.ProductID;

Tento další příklad ukazuje, jak může být vnitřní spojení rozšířeno tak, aby zahrnovalo více než dvě tabulky. Tabulka Sales.SalesOrderDetail je připojena k výstupu JOIN mezi Production.Product a Production.ProductModel. Každá instance JOIN/ON má svůj vlastní základní soubor a filtrování virtuální výstupní tabulky. Optimalizátor dotazů SQL Serveru určuje pořadí, ve kterém se budou provádět spojení a filtrování.

SELECT od.SalesOrderID, m.Name AS Model, p.Name AS ProductName, od.OrderQty
FROM Production.Product AS p
INNER JOIN Production.ProductModel AS m
    ON p.ProductModelID = m.ProductModelID
INNER JOIN Sales.SalesOrderDetail AS od
    ON p.ProductID = od.ProductID
ORDER BY od.SalesOrderID;