ВСТАВИТЬ строки, отсутствующие в ОБНОВЛЕНИИ

Я хочу написать запрос, который, если бы я использовал переменные, выглядел бы примерно так (псевдокод)

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;

это помогает: stackoverflow.com/a/28109175/11695049 ?

tinazmu 26.07.2024 07:23

Прочитав ваш код, я все еще не понимаю, чего вы пытаетесь достичь. Похоже, простой INSERT ... ON CONFLICT должен помочь. Можете ли вы описать свою цель словами?

Laurenz Albe 26.07.2024 07:36

У меня есть 3 таблицы, записи, транзакции и таблица исходящих сообщений. Когда поступает транзакция, она запускает функцию. Я хочу: 1. Выбрать записи, имеющие идентификатор данной транзакции. 2. Обновить все записи в исходящих сообщениях, чтобы установить для поля «has_txn» значение true. 3. Если есть записи, но в исходящих папках ничего нет, я хочу опубликовать записи в исходящих с полем has_txn, установленным в значение true

Marco Groot 26.07.2024 08:00

Оператор MERGE должен помочь.

Salman Arshad 26.07.2024 08:49
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
4
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как будто Лоренц уже подозревал, похоже, что 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, чтобы отменить пустые обновления. Полезно только в том случае, если это может произойти. Видеть:

Другие вопросы по теме