Соединение трех и более таблиц
99
| 21 | 041111111 | Theresa | Markham |
| 22 | 042222222 | Paula | Roberts |
| 23 | 043333333 | Theresa | Markham |
| 24 | 044444444 | John | Blake |
+++++
5 rows in set (0.00 sec)
Теперь таблица
customer
стоит первой, за ней идут таблицы
account
и
employee
.
Поскольку подблоки
on
не изменились, результаты такие же.
Запрос, использующий три или более таблиц, можно представить как
снежный ком, катящийся с горы. Первые две таблицы запускают этот
ком, а каждая последующая таблица вносит в него свою лепту. Снеж
ный
ком можно рассматривать как
промежуточный результирующий
набор
(
intermediate result set
), который подбирает все больше и больше
столбцов по мере соединения с последующими таблицами. Поэтому
таблица
employee
в действительности была соединена не
с таблицей
ac
count
, а с промежуточным результирующим набором, созданным при
соединении таблиц
customer
и
account
. (Если интересно,
откуда взялся
снежный ком: я писал эту главу глубокой новоанглийской зимой –
уже выпало 110 дюймов и завтра будет еще. Вот радостьто!)
Применение подзапросов в качестве таблиц
Вы уже посмотрели несколько примеров запросов с тремя таблицами,
но хочется особо отметить одну из разновидностей таких запросов. Что
делать, если некоторые таблицы формируются подзапросами? Подза
просам посвящена глава 9, но концепция подзапроса в блоке
from
уже
была представлена в предыдущей главе. Вот другая версия приведен
ного ранее запроса (выбор
всех счетов, открытых опытными операцио
нистами, в настоящее время работающими в отделении Woburn), в ко
тором таблица
account
соединяется с подзапросами к таблицам
branch
(отделение) и
employee
:
1 SELECT a.account_id, a.cust_id, a.open_date, a.product_cd
2 FROM account a
INNER JOIN
3 (SELECT emp_id, assigned_branch_id
4 FROM employee
5 WHERE start_date <= '20030101'
6 AND (title = 'Teller' OR title = 'Head Teller')) e
7 ON a.open_emp_id = e.emp_id
8 INNER JOIN
9 (SELECT branch_id
10 FROM branch
11 WHERE name = 'Woburn Branch') b
12 ON e.assigned_branch_id = b.branch_id;
Первый подзапрос, начинающийся в строке 3 и имеющий псевдоним
e
,
находит всех опытных операционистов. Второй подзапрос,
начинаю
щийся в строке 9 и имеющий псевдоним
b
, выбирает ID отделения Wo
burn. Сначала таблица
account
соединяется с подзапросом по опытным