Читайте также:
|
|
Соединение трех таблиц аналогично соединению двух, но есть неболь_ шая хитрость. При соединении двух таблиц имеются две таблицы и один тип соединения в блоке from, а также единственный подблок on, определяющий, как соединяются таблицы. При соединении трех таб_ лиц присутствуют три таблицы и два типа соединения в блоке from, а также два подблока on. Вот еще один пример запроса с соединением двух таблиц:
mysql> | SELECT a.account_id, | c.fed_id | ||
_> | FROM | account a | INNER | JOIN customer c |
_> | ON | a.cust_id | = c.cust_id | |
98 Глава 5. Запрос к нескольким таблицам
_> WHERE c.cust_type_cd = 'B';
+____________+____________+ | account_id | fed_id | +____________+____________+
| | | 04_1111111 | | |||
| | | 04_1111111 | | | ||
| | | 04_2222222 | | | ||
| | | | 04_3333333 | | | |
| | | | 04_4444444 | | |
+____________+____________+ 5 rows in set (0.06 sec)
Этот запрос, возвращающий ID счета и идентификационный номер фе_ дерального налога для всех бизнес_счетов, на данный момент должен быть абсолютно понятным. Однако если добавить в запрос таблицу emp_ loyee для получения имени операциониста, открывшего каждый из сче_ тов, он примет следующий вид:
mysql> | SELECT a.account_id, | c.fed_id, e.fname, e.lname | |
_> | FROM account a INNER | JOIN customer c | |
_> | ON a.cust_id = c.cust_id | ||
_> | INNER JOIN employee e | ||
_> | ON a.open_emp_id = e.emp_id | ||
_> | WHERE c.cust_type_cd | = 'B'; | |
+____________+____________+_________+_________+ | |||
| account_id | fed_id | | | fname | lname | | |
+____________+____________+_________+_________+ | |||
| | 20 | 04_1111111 | Theresa | Markham | | ||
| 21 | 04_1111111 | Theresa | Markham |
| 22 | 04_2222222 | Paula | Roberts |
| 23 | 04_3333333 | Theresa | Markham |
| 24 | 04_4444444 | John | Blake | +____________+____________+_________+_________+ 5 rows in set (0.03 sec)
Теперь имеется три таблицы, два типа соединений и два подблока on, перечисленные в блоке from. Таким образом, все немного усложняется. На первый взгляд из_за порядка перечисления таблиц может пока_ заться, что таблица employee соединяется с таблицей customer, посколь_ ку таблица account указана первой. Однако если изменить порядок рас_ положения таблиц, результаты будут абсолютно аналогичными:
mysql> | SELECT a.account_id, c.fed_id, e.fname, e.lname | |
_> | FROM | customer c INNER JOIN account a |
_> | ON | a.cust_id = c.cust_id |
_> | INNER JOIN employee e | |
_> | ON | a.open_emp_id = e.emp_id |
_> | WHERE c.cust_type_cd = 'B'; |
+____________+____________+_________+_________+ | account_id | fed_id | fname | lname | +____________+____________+_________+_________+ | 20 | 04_1111111 | Theresa | Markham |
Соединение трех и более таблиц | |
| 21 | 04_1111111 | Theresa | Markham |
| 22 | 04_2222222 | Paula | Roberts |
| 23 | 04_3333333 | Theresa | Markham |
| 24 | 04_4444444 | John | Blake | +____________+____________+_________+_________+ 5 rows in set (0.00 sec)
Теперь таблица customer стоит первой, за ней идут таблицы account и employee. Поскольку подблоки on не изменились, результаты такие же.
Запрос, использующий три или более таблиц, можно представить как снежный ком, катящийся с горы. Первые две таблицы запускают этот ком, а каждая последующая таблица вносит в него свою лепту. Снеж_ ный ком можно рассматривать как промежуточный результирующий набор (intermediate result set), который подбирает все больше и большестолбцов по мере соединения с последующими таблицами. Поэтому таблица employee в действительности была соединена не с таблицей ac_ count, а с промежуточным результирующим набором, созданным при соединении таблиц customer и account. (Если интересно, откуда взялся снежный ком: я писал эту главу глубокой новоанглийской зимой – уже выпало 110 дюймов и завтра будет еще. Вот радость_то!)
Дата добавления: 2015-08-17; просмотров: 61 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
ANSI_синтаксис соединения | | | Применение подзапросов в качестве таблиц |