我想使用参数和另一个表中的一些可选值来执行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));
哪个有效但当然看起来不必要因为两个子选择而变慢。
所以我的问题是:我能以某种方式只使用一个子选项来使用它。
答案 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