Ten artykuł zawiera omówienie samodzielnego łączenia w SQL, a także podstawowy przykład.
Co to jest samodołączenie?
SQL SELF JOIN
dołącza do siebie stół. Może być przydatny do wykonywania zapytań dotyczących danych hierarchicznych w tej samej tabeli lub do porównywania wierszy w tej samej tabeli.
Przykład 1 – Samodzielne dołączenie
Klasycznym przykładem samodzielnego sprzężenia jest tabela Pracownicy. W takiej tabeli jeden pracownik może podlegać innemu pracownikowi. Dlatego możesz użyć samodzielnego łączenia, aby dołączyć do tabeli w kolumnie Identyfikator pracownika i Identyfikator menedżera.
Załóżmy, że mamy następującą tabelę:
+--------------+-------------+------------+-------------+ | 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 | +--------------+-------------+------------+-------------+
Możemy wykonać samodzielne dołączenie na tym stole, aby zwrócić wszystkich pracowników i ich menedżerów.
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;
Wynik:
+------------------+-----------------+ | 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 i Marge Morrison nie podlegają nikomu, więc ich Manager
pole jest puste. Właściwie byłoby to NULL
gdybym nie wykonał konkatenacji ciągów na dwóch kolumnach.
Przykład 2 – Łączenie wewnętrzne
Jeśli nie chcielibyśmy, aby zwrócono dwie głowy, moglibyśmy zrobić wewnętrzne połączenie na stole. Wyeliminuje to wszystkie wiersze, które nie pasują do obu tabel (tj. pracownicy, którzy nie mają odpowiedniego menedżera i odwrotnie).
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;
Wynik:
+------------------+-----------------+ | 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 | +------------------+-----------------+
Przykład 3 – Łączenie własnoręczne
Gdybyśmy chcieli wykonać samo-prawidłowe sprzężenie, musielibyśmy przetasować kilka kolumn w zapytaniu.
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;
Wynik:
+-----------------+------------------+ | 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 | +-----------------+------------------+