Изучаем sql


> WHERE name = 'Woburn Branch')



Pdf көрінісі
бет158/261
Дата28.07.2022
өлшемі1,6 Mb.
#147825
1   ...   154   155   156   157   158   159   160   161   ...   261
Байланысты:
Изучаем SQL ( PDFDrive )

> WHERE name = 'Woburn Branch')
> AND open_emp_id IN (SELECT emp_id
> FROM employee
> WHERE title = 'Teller' OR 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)
Чтобы выявить ID отделения Woburn и ID всех банковских операцио
нистов, этот запрос использует два подзапроса. Затем содержащий за
прос использует эту информацию для выбора всех текущих счетов, от


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
. Таким образом, запрос в его теперешней форме
будет проверять только по одному счету за раз. В следующем разделе
мы научимся создавать более общую форму запроса, которая будет
проверять 
все
счета за одно выполнение.


Достарыңызбен бөлісу:
1   ...   154   155   156   157   158   159   160   161   ...   261




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет