Тази статия предоставя общ преглед на самостоятелното присъединяване в SQL, както и основен пример.
Какво е самостоятелно присъединяване?
SQL SELF JOIN
присъединява маса към себе си. Може да бъде полезно за запитване на йерархични данни в една и съща таблица или за сравняване на редове в същата таблица.
Пример 1 – Самостоятелно ляво присъединяване
Класически пример за самостоятелно присъединяване е в таблица на служителите. В такава таблица един служител може да докладва на друг служител. Следователно, можете да използвате самостоятелно присъединяване, за да се присъедините към таблицата в колоната за идентификационен номер на служител и колоната с идентификационен номер на мениджър.
Да предположим, че имаме следната таблица:
+--------------+-------------+------------+-------------+ | 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 | +--------------+-------------+------------+-------------+
Можем да направим самостоятелно ляво присъединяване на тази маса, за да върнем всички служители и техните мениджъри.
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;
Резултат:
+------------------+-----------------+ | 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 | +------------------+-----------------+
Хоумър Конъри и Мардж Морисън не докладват на никого и затова техният Manager
полето е празно. Всъщност би било NULL
ако не бях извършил конкатенация на низове на двете колони.
Пример 2 – Самостоятелно вътрешно присъединяване
Ако не искаме двете глави да бъдат върнати, тогава бихме могли да направим вътрешно свързване на масата. Това ще елиминира всички редове, които нямат съвпадение и в двете таблици (т.е. тези служители, които нямат съответен мениджър и обратно).
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;
Резултат:
+------------------+-----------------+ | 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 | +------------------+-----------------+
Пример 3 – Самоправно присъединяване
Ако искаме да направим самостоятелно правилно присъединяване, ще трябва да разбъркаме няколко колони в заявката.
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;
Резултат:
+-----------------+------------------+ | 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 | +-----------------+------------------+