Изучаем sql


SELECT a.account_id, a.product_cd, a.cust_id



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

SELECT a.account_id, a.product_cd, a.cust_id
> FROM account a
> WHERE NOT EXISTS (SELECT 1
> FROM business b
> WHERE b.cust_id = a.cust_id);


182
Глава 9. Подзапросы
++++
| account_id | product_cd | cust_id |
++++
| 1 | CHK | 1 |
| 2 | SAV | 1 |
| 3 | CD | 1 |
| 4 | CHK | 2 |
| 5 | SAV | 2 |
| 6 | CHK | 3 |
| 7 | MM | 3 |
| 8 | CHK | 4 |
| 9 | SAV | 4 |
| 10 | MM | 4 |
| 11 | CHK | 5 |
| 12 | CHK | 6 |
| 13 | CD | 6 |
| 14 | CD | 7 |
| 15 | CHK | 8 |
| 16 | SAV | 8 |
| 17 | CHK | 9 |
| 18 | MM | 9 |
| 19 | CD | 9 |
++++
19 rows in set (0.04 sec)
Этот запрос выявляет всех клиентов, ID которых нет в таблице 
busi
ness
, – окольный путь для поиска всех клиентовфизических лиц.
Манипулирование данными 
с помощью связанных подзапросов
До сих пор в этой главе в качестве примеров приводились только выра
жения 
select
, но это не значит, что в других SQLвыражениях подза
просы не используются. Они также широко задействуются в выраже
ниях 
update

delete
и 
insert
, а связанные подзапросы часто применяют
ся в выражениях 
update
и 
delete
. Вот пример связанного подзапроса,
с помощью которого изменяется столбец 
last_activity_date
таблицы
account
:
UPDATE account a
SET a.last_activity_date =
(SELECT MAX(t.txn_date)
FROM transaction t
WHERE t.account_id = a.account_id);
Это выражение корректирует все строки таблицы 
account
(поскольку
блока 
where
нет), выбирая дату последней операции для каждого счета.
Хотя кажется разумным ожидать, что для каждого счета будет суще
ствовать, по крайней мере, одна связанная с ним операция, но лучше
проверить наличие такой операции, прежде чем пытаться обновить
столбец 
last_activity_date
. В противном случае в столбце появится


Использование подзапросов
183
значение 
null
, поскольку по подзапросу не будет возвращено ни одной
строки. Вот другой вариант выражения 
update
, на этот раз использую
щий блок 
where
со вторым связанным подзапросом:
UPDATE account a
SET a.last_activity_date =
(SELECT MAX(t.txn_date)
FROM transaction t
WHERE t.account_id = a.account_id)
WHERE EXISTS (SELECT 1
FROM transaction t
WHERE t.account_id = a.account_id);
Эти два связанных подзапроса идентичны, за исключением блоков 
se
lect
. Однако подзапрос блока 
set
выполняется, только если условие
блока 
where
выражения 
update
истинно (
true
) (т. е. для счета была най
дена, по крайней мере, одна операция). Таким образом данные столбца
last_activity_date
защищены от перезаписи значением 
null
.
Связанные подзапросы обычны и в выражениях 
delete
. Например,
в конце каждого месяца запускается сценарий, уничтожающий не
нужные данные. Этот сценарий может включать следующее выраже
ние, которое удаляет из таблицы 
department
данные, не имеющие до
черних строк в таблице 
employee
:
DELETE FROM department
WHERE NOT EXISTS (SELECT 1
FROM employee
WHERE employee.dept_id = department.dept_id);
При использовании связанных подзапросов в выражениях 
delete
в MySQL необходимо помнить, что псевдонимы таблиц не допускаются
ни в коем случае. Вот почему в этом подзапросе приходилось использо
вать полное имя таблицы. Для большинства других серверов БД мож
но было бы снабдить таблицы 
department
и 
employee
псевдонимами:
DELETE FROM department d
WHERE NOT EXISTS (SELECT 1
FROM employee e
WHERE e.dept_id = d.dept_id);


Достарыңызбен бөлісу:
1   ...   158   159   160   161   162   163   164   165   ...   261




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

    Басты бет