Читайте также:
|
|
Можно не только несколько раз включать одну и ту же таблицу в один запрос, фактически можно соединить таблицу с самой собой. Поначалу это может показаться странным, но для этого есть веские основания. В таблице employee, например, есть рекурсивный внешний ключ (self_ referencing foreign key). Это означает, что она включает столбец (supe_rior_emp_id), указывающий на первичный ключ в рамках той же табли_ цы. Этот столбец указывает на начальника сотрудника (если только это не сам босс – тогда столбец имеет значение null). С помощью рекур_ сивного соединения (self_join) можно создать запрос, в результате вы_полнения которого выводится список всех сотрудников с указанием имен их начальников:
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.01 | sec) |
Этот запрос включает два экземпляра таблицы employee: из одного (под псевдонимом e) извлекаются имена сотрудников, а из другого (под псев_ донимом e_mgr) – имена начальников. Подблок on использует эти псев_ донимы для соединения таблицы employee с самой собой посредством внешнего ключа superior_emp_id. Это еще один пример запроса, для ко_
Сравнение эквисоединений с неэквисоединениями | |
торого псевдонимы таблиц являются обязательными. В противном случае сервер не сможет определить, на кого делается ссылка – на со_ трудника или его начальника.
Хотя в таблице employee 18 строк, по запросу было возвращено только 17. У президента банка, Майкла Смита (Michael Smith), нет начальника (его столбец superior_emp_id имеет значение null), поэтому для данной строки соединение не сработало. Чтобы включить Майкла Смита в ре_ зультирующий набор, необходимо использовать внешнее соединение, которое будет рассмотрено в главе 10.
Дата добавления: 2015-08-17; просмотров: 55 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Повторное использование таблицы | | | Сравнение эквисоединений с неэквисоединениями |