Použití vnějších spojení

Dokončeno

I když není tak běžné jako vnitřní spojení, použití vnějších spojení v dotazu s více tabulkami může poskytnout alternativní zobrazení obchodních dat. Stejně jako u vnitřních spojení vyjadřujete mezi tabulkami logickou relaci. Načtete ale nejen řádky s odpovídajícími atributy, ale také všechny řádky, které jsou přítomné v jedné nebo obou tabulkách, bez ohledu na to, jestli v druhé tabulce existuje shoda.

Dříve jste zjistili, jak pomocí funkce INNER JOIN najít odpovídající řádky mezi dvěma tabulkami. Jak jste viděli, procesor dotazů sestaví výsledky dotazu INNER JOIN tím, že vyfiltruje řádky, které nesplňují podmínky vyjádřené predikátem klauzule ON. Výsledkem je, že se vrátí pouze řádky s odpovídajícím řádkem v druhé tabulce. Pomocí vnějšího spojení můžete zobrazit všechny řádky, které mají odpovídající řádky mezi tabulkami, a všechny řádky, které nemají shodu v druhé tabulce. Pojďme se podívat na příklad a prozkoumat proces.

Nejprve prozkoumejte následující dotaz napsaný pomocí INNER JOIN:

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

Tyto řádky představují shodu mezi hr. Employee and Sales.SalesOrder. Ve výsledcích se zobrazí jenom hodnoty EmployeeID, které jsou v obou tabulkách.

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

Teď se podíváme na následující dotaz, který je napsaný jako LEFT OUTER JOIN:

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

Tento příklad používá operátor LEFT OUTER JOIN, který směruje procesor dotazu, aby zachoval všechny řádky z tabulky na levé straně (HR). Employee) a zobrazí hodnoty Amount pro odpovídající řádky v Sales.SalesOrder. Vrátí se ale všechny zaměstnance, ať už si vzali prodejní objednávku nebo ne. Místo hodnoty Částka dotaz vrátí hodnotu NULL pro zaměstnance bez odpovídajících prodejních objednávek.

A Venn diagram showing the outer join results of the Employee and SalesOrder sets

Syntaxe OUTER JOIN

Vnější spojení jsou vyjádřena pomocí klíčových slov LEFT, RIGHT nebo FULL před vnějším spojením. Účelem klíčového slova je označit, která tabulka (na které straně klíčového slova JOIN) by měla být zachována a má všechny její řádky zobrazeny; shoda nebo žádná shoda.

Při definování spojení pomocí funkce LEFT, RIGHT nebo FULL můžete vynechat klíčové slovo OUTER, jak je znázorněno zde:

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

Podobně jako klíčové slovo INNER je ale často užitečné napsat kód, který je explicitní o používaném typu spojení.

Při psaní dotazů pomocí OUTER JOIN zvažte následující pokyny:

  • Jak jste viděli, aliasy tabulek se preferují nejen pro seznam SELECT, ale také pro klauzuli ON.
  • Stejně jako u INNER JOIN může být VNĚJŠÍ SPOJENÍ provedeno v jednom odpovídajícím sloupci nebo u více odpovídajících atributů.
  • Na rozdíl od FUNKCE INNER JOIN záleží na pořadí, ve kterém jsou tabulky uvedeny a spojené v klauzuli FROM, protože určuje, jestli pro spojení zvolíte LEFT nebo RIGHT.
  • Spojení s více tabulkami jsou složitější, pokud je k dispozici VNĚJŠÍ SPOJENÍ. Přítomnost seznamů NUL ve výsledcích VNĚJŠÍHO SPOJENÍ může způsobit problémy, pokud jsou přechodné výsledky pak spojené s třetí tabulkou. Řádky s hodnotami NULLs mohou být vyfiltrovány predikátem druhého spojení.
  • Pokud chcete zobrazit pouze řádky, ve kterých neexistuje žádná shoda, přidejte test hodnoty NULL v klauzuli WHERE za predikátem OUTER JOIN.
  • ÚPLNÉ VNĚJŠÍ SPOJENÍ se používá zřídka. Vrátí všechny odpovídající řádky mezi těmito dvěma tabulkami a všechny řádky z první tabulky bez shody ve druhé tabulce a všechny řádky v sekundě bez shody v první.
  • Neexistuje způsob, jak předpovědět pořadí, ve které se řádky vrátí bez klauzule ORDER BY. Neexistuje způsob, jak zjistit, jestli se jako první vrátí odpovídající nebo chybějící řádky.