Читайте также:
|
|
До сих пор в этой главе в качестве примеров приводились только выра_ жения 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. В противном случае в столбце появится
Использование подзапросов | |
значение 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);
Дата добавления: 2015-08-17; просмотров: 52 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Оператор exists | | | Использование подзапросов |