Рекурсивныевнешние соединения В главе 5 была представлена концепция рекурсивного соединения, при
котором таблица соединяется сама с собой. Вот пример рекурсивного
соединения из главы 5, в котором таблица
employee
соединяется сама
с собой для формирования списка сотрудников и их руководителей:
mysql>
SELECT e.fname, e.lname, > e_mgr.fname mgr_fname, e_mgr.lname mgr_lname > FROM employee e INNER JOIN employee e_mgr > ON e.superior_emp_id = e_mgr.emp_id; +++++
| fname | lname | mgr_fname | mgr_lname |
+++++
| Susan | Barker | Michael | Smith |
| Robert | Tyler | Michael | Smith |
| Susan | Hawthorne | Robert | Tyler |
| John | Gooding | Susan | Hawthorne |
| Helen | Fleming | Susan | Hawthorne |
| Chris | Tucker | Helen | Fleming |
| Sarah | Parker | Helen | Fleming |
| Jane | Grossman | Helen | Fleming |
| Paula | Roberts | Susan | Hawthorne |
| Thomas | Ziegler | Paula | Roberts |
| Samantha | Jameson | Paula | Roberts |
| John | Blake | Susan | Hawthorne |
| Cindy | Mason | John | Blake |
| Frank | Portman | John | Blake |
| Theresa | Markham | Susan | Hawthorne |
| Beth | Fowler | Theresa | Markham |
| Rick | Tulman | Theresa | Markham |
+++++
17 rows in set (0.02 sec)
Этот запрос функционирует нормально за исключением одной малень
кой неувязки: в результирующий набор не включаются сотрудники,
у которых нет начальника. Однако после замены внутреннего соедине
ния на внешнее в результирующий набор попадают все сотрудники,
даже те, у которых нет руководителя:
mysql>
SELECT e.fname, e.lname, > e_mgr.fname mgr_fname, e_mgr.lname mgr_lname > FROM employee e LEFT OUTER JOIN employee e_mgr > ON e.superior_emp_id = e_mgr.emp_id; +++++
| fname | lname | mgr_fname | mgr_lname |