Há duas razões possíveis para a atualização tentar foo.a para NULL.
- Existem linhas em foo para as quais não há linhas correspondentes em bar.
- A linha correspondente em bar tem bar.x igual a nulo.
O seguinte excluirá atualizações para foo se uma das condições acima for verdadeira. Nesses casos, foo.a permanecerá como era:
update foo
set a = (select distinct( x ) from bar where bar.y = foo.b )
where exists
(select *
from bar
where bar.y = foo.b
and bar.x is not null);