从可选子查询中插入多个返回值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从可选子查询中插入多个返回值相关的知识,希望对你有一定的参考价值。
我想用参数和另一个表中的一些可选值来执行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));
哪个有效,但当然看起来不必要因为两个子选择而变慢。
所以我的问题是:我能以某种方式只使用一个子选择。
答案
你可以加入一个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
另一答案
一种方法:
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)。
以上是关于从可选子查询中插入多个返回值的主要内容,如果未能解决你的问题,请参考以下文章