Читайте также:
|
|
В некоторых случаях может потребоваться провести внешнее соедине_ ние одной таблицы с двумя другими таблицами. Например, нужен список всех счетов с указанием или имени и фамилии физического ли_ ца, или названия фирмы для юридического лица:
mysql> | SELECT a.account_id, a.product_cd, |
_> | CONCAT(i.fname, ' ', i.lname) person_name, |
_> | b.name business_name |
_> | FROM account a LEFT OUTER JOIN individual i |
_> | ON a.cust_id = i.cust_id |
_> | LEFT OUTER JOIN business b |
_> | ON a.cust_id = b.cust_id; |
+____________+____________+_________________+________________________+ | account_id | product_cd | person_name | business_name | +____________+____________+_________________+________________________+
| | | | CHK | | James Hadley | | NULL | | | |
| | | | SAV | | James Hadley | | NULL | | | |
| | | | CD | | James Hadley | | NULL | | | |
| | | | CHK | | Susan Tingley | | NULL | | | |
| | | | SAV | | Susan Tingley | | NULL | | | |
| | | | CHK | | Frank Tucker | | NULL | | | |
| | | | MM | | Frank Tucker | | NULL | | | |
| | | | CHK | | John Hayward | | NULL | | | |
| | | | SAV | | John Hayward | | NULL | | | |
| | | | MM | | John Hayward | | NULL | | | |
| | | | CHK | | Charles Frasier | | NULL | | | |
| | | | CHK | | John Spencer | | NULL | | | |
| | | | CD | | John Spencer | | NULL | | | |
| | | | CD | | Margaret Young | | NULL | | | |
| | | | CHK | | Louis Blake | | NULL | | | |
| | | | SAV | | Louis Blake | | NULL | | | |
| | | | CHK | | Richard Farley | | NULL | | | |
| | | | MM | | Richard Farley | | NULL | | | |
| | | | CD | | Richard Farley | | NULL | | | |
| | | | CHK | | NULL | | Chilton Engineering | | | |
| | | | BUS | | NULL | | Chilton Engineering | | | |
| | | | BUS | | NULL | | Northeast Cooling Inc. | | ||
| | | | CHK | | NULL | | Superior Auto Body | | | |
| | | | SBL | | NULL | | AAA Insurance Inc. | | |
+____________+____________+_________________+________________________+ 24 rows in set (0.00 sec)
202 Глава 10. И снова соединения
Результаты включают все 24 строки таблицы account, а также имена клиентов или названия фирм, поступающие из двух других таблиц в результате внешнего соединения.
Мне не известны ограничения в MySQL, касающиеся количества таб_ лиц, с которыми можно осуществлять внешнее соединение. Но чтобы сократить число соединений в запросе, всегда можно воспользоваться подзапросами. Например, предыдущий пример можно переписать так:
mysql> | SELECT account_ind.account_id, account_ind.product_cd, |
_> | account_ind.person_name, |
_> | b.name business_name |
_> | FROM |
_> | (SELECT a.account_id, a.product_cd, a.cust_id, |
_> | CONCAT(i.fname, ' ', i.lname) person_name |
_> | FROM account a LEFT OUTER JOIN individual i |
_> | ON a.cust_id = i.cust_id) account_ind |
_> | LEFT OUTER JOIN business b |
_> | ON account_ind.cust_id = b.cust_id; |
+____________+____________+_________________+________________________+ | account_id | product_cd | person_name | business_name | +____________+____________+_________________+________________________+
| | | CHK | | James Hadley | | NULL | | | |
| | | SAV | | James Hadley | | NULL | | | |
| | | CD | | James Hadley | | NULL | | | |
| | | CHK | | Susan Tingley | | NULL | | | |
| | | SAV | | Susan Tingley | | NULL | | | |
| | | CHK | | Frank Tucker | | NULL | | | |
| | | MM | | Frank Tucker | | NULL | | | |
| | | CHK | | John Hayward | | NULL | | | |
| | | SAV | | John Hayward | | NULL | | | |
| | | MM | | John Hayward | | NULL | | | |
| | | CHK | | Charles Frasier | | NULL | | | |
| | | CHK | | John Spencer | | NULL | | | |
| | | CD | | John Spencer | | NULL | | | |
| | | CD | | Margaret Young | | NULL | | | |
| | | CHK | | Louis Blake | | NULL | | | |
| | | SAV | | Louis Blake | | NULL | | | |
| | | CHK | | Richard Farley | | NULL | | | |
| | | MM | | Richard Farley | | NULL | | | |
| | | CD | | Richard Farley | | NULL | | | |
| | | CHK | | NULL | | Chilton Engineering | | | |
| | | BUS | | NULL | | Chilton Engineering | | | |
| | | BUS | | NULL | | Northeast Cooling Inc. | | ||
| | | CHK | | NULL | | Superior Auto Body | | | |
| | | SBL | | NULL | | AAA Insurance Inc. | | |
+____________+____________+_________________+________________________+ 24 rows in set (0.00 sec)
В этом варианте запроса внешнее соединение таблицы individual с таб_ лицей account осуществляется в подзапросе account_ind, результаты ко_ торого затем путем внешнего соединения соединяются с таблицей bu_
Внешние соединения | |
siness. Таким образом, каждый запрос (подзапрос и основной запрос) использует только одно внешнее соединение. При работе с другой БД (не с MySQL) эта стратегия может пригодиться для осуществления внешнего соединения с более чем одной таблицей.
Дата добавления: 2015-08-17; просмотров: 38 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Сравнение левосторонних и правосторонних внешних соединений | | | Рекурсивные внешние соединения |