178
Глава 9. Подзапросы
крытых старшим операционистом в отделении Woburn. Но в таблице
employee
есть информация об отделении, в
котором числится каждый со
трудник, поэтому те же результаты можно получить путем сравнения
столбцов
account.open_branch_id
и
account.open_emp_id
с единственным
подзапросом к таблицам
employee
и
branch
. Для этого в условии фильтра
ции следует указать в круглых скобках имена обоих столбцов таблицы
account
в
том же порядке, в каком они возвращаются подзапросом:
mysql>
SELECT account_id, product_cd, cust_id
> FROM account
> WHERE (open_branch_id, open_emp_id) IN
> (SELECT b.branch_id, e.emp_id
> FROM branch b INNER JOIN employee e
> ON b.branch_id = e.assigned_branch_id
> WHERE b.name = 'Woburn Branch'
> AND (e.title = 'Teller' OR e.title = 'Head Teller'));
++++
| account_id | product_cd | cust_id |
++++
| 1 | CHK | 1 |
| 2 | SAV | 1 |
| 3 | CD | 1 |
| 4 | CHK | 2 |
| 5 | SAV | 2 |
| 14 | CD | 7 |
| 22 | BUS | 11 |
++++
7 rows in set (0.00 sec)
Эта версия запроса делает то же самое, что и предыдущий пример, но
с помощью всего одного подзапроса,
который возвращает два столбца,
а не двух подзапросов, возвращающих по одному столбцу.
Конечно, можно было бы переписать предыдущий пример, просто со
единив три таблицы, без этой возни с подзапросами. Но при изучении
SQL полезно увидеть несколько путей достижения одного результата.
Вот
еще один пример, требующий применения подзапроса. Скажем,
от клиентов поступило несколько жалоб, связанных с неверными зна
чениями в столбцах доступного остатка и отложенного остатка (pending
balance) таблицы
account
. Задача – найти все счета, остатки на которых
не соответствуют суммам по операциям для этого счета.
Вот частичное
решение проблемы:
SELECT 'ALERT! : Account #1 Has Incorrect Balance!'
FROM account
WHERE (avail_balance, pending_balance) <>
(SELECT SUM(
),
SUM()
FROM transaction
WHERE account_id = 1)
AND account_id = 1;
Связанные подзапросы
179
Как видите, здесь нет выражений, суммирующих операции для вычис
ления доступного и
отложенного остатков, но обещаю, что в главе 11,
когда мы научимся создавать выражения
case
, все будет доработано.
Но даже в таком виде запрос достаточно полон, чтобы увидеть, что
подзапрос генерирует две суммы из таблицы
transaction
,
которые по
том сравниваются со столбцами
avail_balance
и
pending_balance
табли
цы
account
. И подзапрос, и основной запрос включают условие фильт
рации
account_id
=
1
. Таким образом, запрос в его теперешней форме
будет проверять только по одному счету за раз. В
следующем разделе
мы научимся создавать более общую форму запроса, которая будет
проверять
все
счета за одно выполнение.
Достарыңызбен бөлісу: