Подскажите, как правильно реализовать мою идею в postgresql? Необходимо добавлять из одной таблицы в другую в соответствии с определенным условием

У меня есть две таблицы accounts и technical_base. В таблице accounts скрипт заполняется автоматически, но не все столбцы. Мне нужно взять данные из technical_base таблицы для заполнения.

Мои таблицы:

                **Technical_base**          
source  model   rated_energy    general_tarif
info_1  s9         1300          5
info_1  a10        1200          5
info_2  s9         1300          3.5
info_2  a10        1200          3.5


                   **accounts**                                     
source  object     redirect   model  number_of_cars rated_energy    general_tariff  personal_tariff personal_energy result_for_the_month    date
info_1  info_object Client_1    s9          info                                           Info       info                info              info
info_2  info_object Client_2    s9          info                                           info      info                 info              info
info_1  info_object Client_3    a10         info                                           info       info                info              info
info_2  info_object Cleint_4    a10         info                                           info       info                info              info

Какой результат хочу:

                     **accounts**                                       
source  object  redirect    model   number_of_cars  rated_energy    general_tariff  personal_tariff personal_energy result_for_the_month    date
info_1  info_object Client_1 s9           info          1300               5          info               info              info             info
info_2  info_object Client_2 s9           info          1300               3.5        info               info              info             info
info_1  info_object Client_3 a10          info          1200               5          info               info             info              info
info_2  info_object Cleint_4 a10          info          1200               3.5        info               info             info              info

в результате мне нужен правильный запрос, чтобы он находил данные из технической таблицы и сравнивал их в таблице accounts и заполнил столбцы rated_energy и general_tarif так информация есть ток там.

что ун их общего у таблиц это sourcе и model, по ним он должен искать у technical_base и записывать accounts.

Я думал о вариантах с ключами, но я думаю, что это сложно...

Если нужны еще доп. инфа или код для создание таблиц то пишите скину.

Запрос на таблицы https://dbfiddle.uk/?rdbms=postgres_14&fiddle=92b67e79ece3bd86b5c579bec03639f9

Получаеться на такой запрос но он не правильный...

UPDATE accounts SET rated_energy = (SELECT rated_energy FROM technical_base WHERE technical_base.model = accounts.model and  technical_base.source = accounts.source) AND
SET general_tariff = (SELECT general_tariff FROM technical_base WHERE technical_base.model = accounts.model and  technical_base.source = accounts.source) WHERE EXISTS (SELECT rated_energy FROM technical_base WHERE technical_base.model = accounts.model and  technical_base.source = accounts.source) AND SELECT general_tariff FROM technical_base
WHERE technical_base.model = accounts.model and  technical_base.source = accounts.source);

Ответы (1 шт):

Автор решения: Akina
UPDATE accounts a  -- обновляемая таблица
SET rated_energy = t.rated_energy,  -- что и чем обновляем
    general_tariff = t.general_tariff
FROM technical_base t  -- откуда берём данные для обновления
WHERE a.source = t.source AND a.model = t.model  -- устанавливаем соответствие
  AND (a.rated_energy IS NULL OR a.general_tariff IS NULL);  -- проверяем, надо ли обновлять

https://dbfiddle.uk/?rdbms=postgres_14&fiddle=066c158c05ef5c177e14041a62ab2bd3

Т.е. обновляем только записи, где есть хотя бы одно незаполненное поле.

→ Ссылка