Použití vnějších spojení
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 a Sales.SalesOrder. Ve výsledcích se zobrazí jenom hodnoty EmployeeID , které jsou v obou tabulkách.
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šichni zaměstnanci, ať už přijali 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.
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 všechny její řádky zobrazeny, bez ohledu na to, zda dojde ke shodě či nikoliv.
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 INNER JOIN záleží u OUTER JOIN na pořadí, ve kterém jsou tabulky uvedeny v klauzuli FROM, protože to určuje, zda zvolíte LEFT nebo RIGHT pro spojení.
- Spojení s více tabulkami jsou složitější, pokud je k dispozici VNĚJŠÍ SPOJENÍ. Přítomnost NULL hodnot ve výsledcích VNĚJŠÍHO SPOJENÍ může způsobit problémy, pokud jsou mezivýsledky následně spojeny se třetí tabulkou. Řádky s hodnotou NULL 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, všechny řádky z první tabulky bez shody ve druhé, a všechny řádky z druhé tabulky bez shody v první.
- Neexistuje způsob, jak předpovědět pořadí, v jakém se řádky vrátí bez podmínky ORDER BY. Neexistuje způsob, jak zjistit, jestli se jako první vrátí odpovídající nebo chybějící řádky.