Читайте также:
|
|
В главе 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 | | |
Глава 10. И снова соединения | ||||
+__________+___________+___________+___________+ | ||||
| Michael | | Smith | | NULL | | NULL | | |
| 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 | | |
+__________+___________+___________+___________+ 18 rows in set (0.00 sec)
Результирующий набор теперь включает Майкла Смита (Michael Smith), который является президентом банка, следовательно, начальника у не_ го нет. Для формирования списка всех сотрудников и их начальников, если таковые имеются, запрос использует левостороннее внешнее со_ единение. Если сделать внешнее соединение правосторонним, будут получены следующие результаты:
mysql> | SELECT e.fname, e.lname, | ||||
_> | e_mgr.fname mgr_fname, e_mgr.lname mgr_lname | ||||
_> | FROM | employee e RIGHT OUTER 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 | | | |
| NULL | | NULL | | Susan | | Barker | | | |
| Susan | | Hawthorne | | Robert | | Tyler | | | |
| John | | Gooding | | Susan | | Hawthorne | | ||
| Helen | | Fleming | | Susan | | Hawthorne | | ||
| Paula | | Roberts | | Susan | | Hawthorne | | ||
| John | | Blake | | Susan | | Hawthorne | | ||
| Theresa | Markham | | Susan | | Hawthorne | | |||
| NULL | | NULL | | John | | Gooding | | | |
| Chris | | Tucker | | Helen | | Fleming | | | |
| Sarah | | Parker | | Helen | | Fleming | | | |
| Jane | | Grossman | | Helen | | Fleming | | | |
| NULL | | NULL | | Chris | | Tucker | | | |
| NULL | | NULL | | Sarah | | Parker | | | |
Перекрестные соединения | ||||
| NULL | | NULL | | Jane | | Grossman | | |
| Thomas | | Ziegler | | Paula | | Roberts | | |
| Samantha | | Jameson | | Paula | | Roberts | | |
| NULL | | NULL | | Thomas | | Ziegler | | |
| NULL | | NULL | | Samantha | | Jameson | | |
| Cindy | | Mason | | John | | Blake | | |
| Frank | | Portman | | John | | Blake | | |
| NULL | | NULL | | Cindy | | Mason | | |
| NULL | | NULL | | Frank | | Portman | | |
| Beth | | Fowler | | Theresa | | Markham | | |
| Rick | | Tulman | | Theresa | | Markham | | |
| NULL | | NULL | | Beth | | Fowler | | |
| NULL | | NULL | | Rick | | Tulman | | |
+__________+___________+___________+___________+ 28 rows in set (0.00 sec)
По этому запросу выбираются все руководители (по_прежнему третий и четвертый столбцы) вместе со всеми их подчиненными. Поэтому Майкл Смит появляется дважды – как начальник Сьюзен Баркер (Su_ san Barker) и Роберта Тайлера (Robert Tyler). Сьюзен Баркер появляет_ ся один раз, она никем не руководит (значения null в первом и втором столбцах). Все 18 сотрудников появляются в третьем и четвертом столб_ цах, по крайней мере, один раз. Некоторые появляются несколько раз, если у них в подчинении несколько сотрудников. Таким образом, в ре_ зультирующем наборе 28 строк. Этот результат очень отличается от результата предыдущего запроса, а обеспечен он изменением всего од_ ного ключевого слова (left на right). Следовательно, при использова_ нии внешнего соединения необходимо тщательно продумывать, каким оно должно быть – левосторонним или правосторонним.
Дата добавления: 2015-08-17; просмотров: 53 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Трехсторонние внешние соединения | | | Перекрестные соединения |