Использование подзапросов
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);
Достарыңызбен бөлісу: