使用来自可选子查询的多个 return 值插入

INSERT with multiple return values from optional subquery

我想使用来自另一个 table 的参数和一些可选值执行 INSERT。 (可选的我的意思是如果子查询失败我只想插入参数值而不是什么都不插入。)

我的第一次尝试是:

INSERT INTO my_table (foo, bar, something)
VALUES (:param, (SELECT bar, something FROM other_table WHERE (foo = :param));

但没有用。错误消息是 "subselect must have only one field".

this question 启发的另一种方法是:

INSERT INTO my_table (foo, bar, something)
SELECT :param, o.bar, o.something FROM other_table o WHERE o.foo = :param;

但是这只会在找到 WHERE 子句的内容时才执行 INSERT。所以它的行为不同于真正的子查询。所以我想到了这个:

INSERT INTO my_table (foo, bar, something)
VALUES (:param,
       (SELECT bar FROM other_table WHERE (foo = :param),
       (SELECT something FROM other_table WHERE (foo = :param));

这有效,但由于有两个子选择,当然看起来不必要的慢。

所以我的问题是:我能否以某种方式让它只与一个子选择一起工作。

一种方法:

INSERT INTO my_table (foo, bar, something)
SELECT :param, bar, something
FROM generate_series(1, 1)
LEFT JOIN (
    SELECT bar, something 
    FROM other_table 
    WHERE foo = :param
) x ON TRUE

这是假设您总是想要插入 1 条记录,并且您将没有或只有一个结果用于 other_table 查询(或者您实际上确实希望为所有结果插入相同的参数,如果子查询 returns 多于 1 个结果)。

您可以使用常规 select:

左连接 values 子查询
insert into my_table (foo, bar, something)
select new_foo, bar, something
from ( 
    values (:param)
    ) param (new_foo)
left join (
    select foo, bar, something
    from other_table 
    ) other on new_foo = foo