Минимизировать использование одного и того же подзапроса - PullRequest
0 голосов
/ 10 июня 2018

У меня есть следующая упрощенная функция:

CREATE OR REPLACE FUNCTION upsert(varchar, varchar, varchar) RETURNS void AS $$
BEGIN

with t1 as (
    select id from table_a where $1 = a_field
), t2 as (
    select id from table_a where $2 = a_field
)
insert into table_b (tba_ref, status)
values
    ((select id from t1), $3),
    ((select id from t2), $3)
on conflict on constraint uniq_constraint do
update set status =
    (CASE
    WHEN table_b.tba_ref = (select id from t1) THEN 'old'
    WHEN table_b.tba_ref = (select id from t2) THEN 'new'
    END)
;
END;
$$ language 'plpgsql';

Есть ли способ избавиться от выбранных подзапросов?Это просто упрощенный пример, который примерно отражает структуру исходного запроса.В оригинале намного больше этих двух подзапросов, и я хотел бы повысить производительность, сохранив результат один раз, а не повторяя эти запросы.

1 Ответ

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

Я бы предложил сделать это в виде двух отдельных обновлений:

with t1 as (
      select id from table_a where $1 = a_field
    )
insert into table_b (tba_ref, status)
    values ((select id from t1), $3)),
on conflict on constraint uniq_constraint do
    update set status = 'old';

with t2 as (
      select id from table_a where $2 = a_field
    )
insert into table_b (tba_ref, status)
    values ((select id from t2), $3)),
on conflict on constraint uniq_constraint do
    update set status = 'new';

Вы можете заключить их в одну транзакцию.

Я не думаю, что есть способ передать "другое"msgstr "столбец в предложении on conflict.Ваш insert не имеет возможности различить два значения - то есть 'old' и 'new' не вставляются в таблицу.

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