Tento článek poskytuje přehled vlastního připojení v SQL a také základní příklad.
Co je to samostatné připojení?
SQL SELF JOIN
připojuje stůl k sobě. Může to být užitečné pro dotazování na hierarchická data ve stejné tabulce nebo pro porovnávání řádků ve stejné tabulce.
Příklad 1 – Vlastní levé spojení
Klasickým příkladem vlastního připojení je tabulka Zaměstnanci. V takové tabulce se může jeden zaměstnanec hlásit jinému zaměstnanci. Proto můžete použít vlastní spojení ke spojení tabulky ve sloupci ID zaměstnance a ID manažera.
Předpokládejme, že máme následující tabulku:
+--------------+-------------+------------+-------------+ | EmployeeId | FirstName | LastName | ReportsTo | |--------------+-------------+------------+-------------| | 1 | Homer | Connery | NULL | | 2 | Bart | Pitt | 1 | | 3 | Maggie | Griffin | 1 | | 4 | Peter | Farnsworth | 2 | | 5 | Marge | Morrison | NULL | | 6 | Lisa | Batch | 5 | | 7 | Dave | Zuckerberg | 6 | | 8 | Vlad | Cook | 7 | +--------------+-------------+------------+-------------+
Můžeme provést samostatné levé spojení na tomto stole a vrátit všechny zaměstnance a jejich manažery.
SELECT
CONCAT(e1.FirstName, ' ', e1.LastName) AS Employee,
CONCAT(e2.FirstName, ' ', e2.LastName) AS Manager
FROM Employees e1
LEFT JOIN Employees e2
ON e1.ReportsTo = e2.EmployeeId;
Výsledek:
+------------------+-----------------+ | Employee | Manager | |------------------+-----------------| | Homer Connery | | | Bart Pitt | Homer Connery | | Maggie Griffin | Homer Connery | | Peter Farnsworth | Bart Pitt | | Marge Morrison | | | Lisa Batch | Marge Morrison | | Dave Zuckerberg | Lisa Batch | | Vlad Cook | Dave Zuckerberg | +------------------+-----------------+
Homer Connery a Marge Morrisonová se nikomu nehlásí, a tak jejich Manager
pole je prázdné. Ve skutečnosti by to bylo NULL
kdybych na dvou sloupcích neprovedl zřetězení řetězců.
Příklad 2 – Self Inner Join
Pokud bychom nechtěli, aby se vraceli dva hlavové honchos, pak bychom mohli udělat vnitřní spojení na stole. Tím se odstraní všechny řádky, které nemají shodu v obou tabulkách (tj. ti zaměstnanci, kteří nemají odpovídající manažer a naopak).
SELECT
CONCAT(e1.FirstName, ' ', e1.LastName) AS Employee,
CONCAT(e2.FirstName, ' ', e2.LastName) AS Manager
FROM Employees e1
INNER JOIN Employees e2
ON e1.ReportsTo = e2.EmployeeId;
Výsledek:
+------------------+-----------------+ | Employee | Manager | |------------------+-----------------| | Bart Pitt | Homer Connery | | Maggie Griffin | Homer Connery | | Peter Farnsworth | Bart Pitt | | Lisa Batch | Marge Morrison | | Dave Zuckerberg | Lisa Batch | | Vlad Cook | Dave Zuckerberg | +------------------+-----------------+
Příklad 3 – Svéprávné připojení
Pokud bychom chtěli provést vlastní správné spojení, museli bychom v dotazu zamíchat několik sloupců.
SELECT
CONCAT(e1.FirstName, ' ', e1.LastName) AS Manager,
CONCAT(e2.FirstName, ' ', e2.LastName) AS Employee
FROM Employees e1
RIGHT JOIN Employees e2
ON e1.EmployeeId = e2.ReportsTo;
Výsledek:
+-----------------+------------------+ | Manager | Employee | |-----------------+------------------| | | Homer Connery | | Homer Connery | Bart Pitt | | Homer Connery | Maggie Griffin | | Bart Pitt | Peter Farnsworth | | | Marge Morrison | | Marge Morrison | Lisa Batch | | Lisa Batch | Dave Zuckerberg | | Dave Zuckerberg | Vlad Cook | +-----------------+------------------+