Použití vnitřních spojení
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 tabulku HR.Employee jako jednu z vstupních tabulek a přiřazuje jí 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, byli vyfiltrováni klauzulí ON, stejně jako všechny objednávky, které mají ID zaměstnance, jež neodpovídá žádnému záznamu v tabulce HR.Employee.
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í na základě jednoho odpovídajícího sloupce, který spojuje ProductModelID v tabulce Production.Product s ProductModelID 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;