Можно ли одновременно обновлять группу объединенных таблиц в postgres? - PullRequest
0 голосов
/ 03 июня 2018

У меня есть функция получения, которая извлекает значение из ряда соединенных таблиц, например:

SELECT
    foo
FROM
    my_table AS mt
LEFT JOIN my_other_table AS mot ON mt.pkey = mot.fkey
LEFT JOIN my_other_other_table AS moot ON mot.pkey = moot.fkey
WHERE
    mt.pkey = 0

Мне интересно, есть ли способ как-то преобразовать это в функцию установки, которая позволила бы мнеобновить любую часть этой объединенной таблицы и распространить эти изменения обратно на их исходные таблицы, т.е. что-то вроде этого:

UPDATE
    my_table AS mt
    LEFT JOIN my_other_table AS mot ON mt.pkey = mot.fkey
    LEFT JOIN my_other_other_table AS moot ON mot.pkey = moot.fkey
SET
    mt.some_val = 0
    mot.some_other_val = 1
    moot.some_other_other_val = 2
WHERE
    mt.pkey = 0

Я понимаю, что приведенный выше код на самом деле не работает, и я довольноуверен, что это на самом деле невозможно, но я хочу оставить все как есть.Есть ли способ сделать то, что я хочу сделать?Или это потребует более сложной функции plpgsql?

1 Ответ

0 голосов
/ 03 июня 2018

Вы не можете в одном выражении, но вы можете создать транзакцию, чтобы изменить все или ничего:

begin;

UPDATE
    my_table AS mt
SET
    mt.some_val = 0
WHERE
    mt.pkey = 0;


UPDATE
    my_other_table AS mot 
SET
    mot.some_other_val = 1
FROM my_table AS mt
WHERE
    mt.pkey = mot.fkey AND mt.pkey = 0;

UPDATE
    my_other_other_table AS moot
SET
    moot.some_other_other_val = 2
FROM my_table AS mt
    INNER JOIN my_other_table AS mot ON mt.pkey = mot.fkey
WHERE
    mot.pkey = moot.fkey AND mt.pkey = 0;

COMMIT;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...