SQL Postgres - ВСТАВЬТЕ, ГДЕ НЕ СУЩЕСТВУЕТ - PullRequest
0 голосов
/ 12 марта 2019

Я бы хотел вставить новую строку в таблицу A, если не существует строки с указанным id_client (в PostgreSQL):

INSERT INTO tableA(id_client, opr_wpr, data_wpr)
    VALUES((SELECT id_client FROM tableB WHERE id = 272), 212121, now());

Как я могу это сделать?

Ответы [ 3 ]

2 голосов
/ 12 марта 2019

Как это:

INSERT INTO tableA(id_client, opr_wpr, data_wpr)
SELECT b.id_client, 212121, now() 
FROM 
  tableB b 
  LEFT JOIN tableA a 
  ON b.id_client = a.id_client
WHERE b.id = 272 AND a.id_client is null;

Запрос на выборку вернет только одну строку, если есть:

  • запись в таблице B с идентификатором 272
  • нет связанных записей в таблице A для этого b.id_client

Когда нет строки, левое соединение вернет ноль в tableA.id_client. Как только строка будет вставлена ​​в tableA для этого id_client, левое соединение перестанет возвращать ноль и вместо этого вернет связанную строку. Это условие ГДЕ, что a.id_client должен быть нулевым, чего он больше не имеет. Это приводит к тому, что инструкция SELECT возвращает 0 строк, а это означает, что ничего не вставлено

1 голос
/ 12 марта 2019

Используйте SELECT в качестве источника INSERT:

with data as (
  SELECT id_client, 212121 as opr_wpr, now() as data_wpr
  FROM tableB 
  WHERE id = 272
)
INSERT INTO tablea(id_client, opr_wpr, data_wpr)
SELECT *
FROM data
WHERE not exists (select * 
                  from tablea
                  where id_client in (select id_client
                                      from data));

Общее табличное выражение используется, так что условие источника необходимо указывать только один раз.


В качестве альтернативыесли у вас есть уникальное ограничение на tablea.id_client, то вы можете просто сделать:

INSERT INTO tablea(id_client, opr_wpr, data_wpr)
SELECT id_client, 212121, now()
FROM tableB 
WHERE id = 272
on conflict (id_client) do nothing;
0 голосов
/ 12 марта 2019
INSERT INTO tableA(id_client, opr_wpr, data_wpr)
    VALUES((SELECT id_client FROM tableB WHERE id != null), 212121, now());
...