我想在tableA中插入新行,如果不存在具有给定id_client的行(在PostgreSQL中):
INSERT INTO tableA(id_client,opr_wpr,data_wpr) VALUES((SELECT id_client FROM tableB WHERE …
使用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 ,那么你可以简单地做:
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;
INSERT INTO tableA(id_client, opr_wpr, data_wpr) VALUES((SELECT id_client FROM tableB WHERE id != null), 212121, now());
像这样:
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;
当存在以下情况时,select查询将仅返回一行:
如果没有行,则左连接将在tableA.id_client中返回null。只要为该id_client将一行插入tableA,左连接将停止返回null并返回相关的行。 WHERE的一个条件是a.id_client为null,它不再是。这会导致SELECT语句返回0行,这意味着不会插入任何内容