Вы можете оставить внешнее предложение WHERE
, если обрабатываете NULL
s, например с coalesce()
.
UPDATE department
SET budget = budget
+
coalesce((SELECT amount
FROM funds_received
WHERE funds_received.dept_name = department.dept_name), 0);
Это гарантирует, что если отдел не получит никаких средств, не будет возвращено NULL
, что могло бы также дать дополнительный доход NULL
(это может зависеть от СУБД, что происходит в таком случае). coalesce()
превратит NULL
в 0
, нейтральный элемент сложения, поэтому бюджет останется без изменений.
(Предполагая, что funds_received.amount
не может быть NULL
. Если это было NULL
, то coalesce()
не может "знать", если NULL
существует, потому что запись не была найдена или потому что amount
на самом деле было NULL
. В случае amount
на самом деле NULL
, исходный запрос добавит NULL
к бюджету, мой запрос добавит 0
. Таким образом, запросы не были эквивалентны в этом случае Но я думаю, что весьма вероятно, что автор книги имел в виду такое неявное ограничение NOT NULL
на funds_received.amount
.
Но с другой стороны, предложение WHERE
может уменьшить строки, которые должны быть обновлены (даже если обновление эффективно не меняет значение, строки должны быть прочитаны и записаны обратно) и, следовательно, выигрыш производительность.