Я бы структурировал обновление следующим образом:
with cost_data as (
select
item,
max (cost) filter (where item = 'watch') as watch,
max (cost) filter (where item = 'book') as book
from table_b
group by item
)
update table_a a
set
watch = c.watch,
book = c.book
from cost_data c
where
a.item = c.item and
(a.watch is distinct from c.watch or
a.book is distinct from c.book)
По сути, я делаю общее табличное выражение для создания сводной таблицы бедного человека в Таблице B, чтобы получить строки в столбцах.Одно предостережение: если для одного и того же предмета указаны несколько расходов, это может сделать не то, что вы хотите, но тогда вам нужно знать, как справиться с этим практически в любом случае.
Тогда я делаю"обновление A из B" для CTE.
Последняя часть, по сути, не критична, но полезна - ограничить выполнение запроса только теми строками, которые необходимо изменить.Лучше ограничить DML, если это не требуется (лучший способ оптимизировать что-либо - это не делать этого).