从可选子查询中插入多个返回值

时间:2018-04-19 12:52:04

标签: postgresql subquery sql-insert sql-subselect

我想使用参数和另一个表中的一些可选值来执行INSERT。 (使用可选的意思是,如果子查询失败,我想只插入参数值而不是插入任何内容。)

我的第一次尝试是:

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

但没有奏效。错误消息是“subselect必须只有一个字段”。

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

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

但如果找到INSERT子句的内容,则只执行WHERE。所以它的行为与真正的子查询不同。所以我想出了这个:

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));

哪个有效但当然看起来不必要因为两个子选择而变慢。

所以我的问题是:我能以某种方式只使用一个子选项来使用它。

2 个答案:

答案 0 :(得分:1)

一种方法:

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查询您将没有或只有一个结果(或者您实际上希望为所有结果插入相同的参数,如果子查询返回的值超过1结果)。

答案 1 :(得分:1)

您可以使用常规values

加入select子查询
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