Я хочу написать запрос, который, если бы я использовал переменные, выглядел бы примерно так (псевдокод)
records = SELECT * FROM table_1 WHERE id = x
numberOfRowsUpdated = UPDATE table_2 SET column_1 = y WHERE id = record1.id
INSERT INTO table2 (columns) (records.id, records.name, ...) where records exists and numberOfRowsUpdated == 0
В настоящее время у меня есть что-то подобное, но синтаксис кажется недействительным. Сможет ли кто-нибудь оказать какую-либо помощь по включению оператора обновления в пункт WHERE
?
WITH records AS (SELECT id, tx_id FROM table_1 WHERE id = NEW.id)
INSERT INTO table_2 (id,txn_id)
SELECT records.id, records.txn_id)
FROM records
WHERE EXISTS (SELECT 1 FROM records)
AND (UPDATE table_2 SET has_txn = true WHERE id in (records.id) = 0)
У меня это работает не очень хорошо, и я хотел бы улучшить его, чтобы не запрашивать записи несколько раз.
WITH records AS (SELECT * FROM table_1 WHERE txn_id = NEW.id),
numberOfRowsUpdated AS (
UPDATE table_2 SET has_txn = true WHERE id in (SELECT id FROM
table_1 WHERE txn_id = NEW.id) RETURNING 1
)
INSERT INTO outbox (
id,
...
) SELECT (
records.id,
...
)
FROM records, numberOfRowsUpdated
WHERE EXISTS (SELECT 1 FROM records)
AND (select count(*) from numberOfRowsUpdated) = 0;
Прочитав ваш код, я все еще не понимаю, чего вы пытаетесь достичь. Похоже, простой INSERT ... ON CONFLICT
должен помочь. Можете ли вы описать свою цель словами?
У меня есть 3 таблицы, записи, транзакции и таблица исходящих сообщений. Когда поступает транзакция, она запускает функцию. Я хочу: 1. Выбрать записи, имеющие идентификатор данной транзакции. 2. Обновить все записи в исходящих сообщениях, чтобы установить для поля «has_txn» значение true. 3. Если есть записи, но в исходящих папках ничего нет, я хочу опубликовать записи в исходящих с полем has_txn, установленным в значение true
Оператор MERGE должен помочь.
Как будто Лоренц уже подозревал, похоже, что UPSERT может это сделать:
INSERT INTO balance_activity_outbox (id, ...)
SELECT id, ...
FROM table_1
WHERE txn_id = NEW.id
ON CONFLICT (id) DO UPDATE
SET has_txn = true
WHERE has_txn IS NOT TRUE;
Требуется уникальное ограничение/индекс или первичный ключ для balance_activity_outbox(id)
.
Я добавил последний WHERE has_txn IS NOT TRUE
, чтобы отменить пустые обновления. Полезно только в том случае, если это может произойти. Видеть:
это помогает: stackoverflow.com/a/28109175/11695049 ?