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

问题描述 投票:0回答:2

我想用参数和另一个表中的一些可选值来执行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));

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

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

postgresql subquery sql-insert sql-subselect
2个回答
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

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

© www.soinside.com 2019 - 2024. All rights reserved.