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

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

以上是关于从可选子查询中插入多个返回值的主要内容,如果未能解决你的问题,请参考以下文章

从可选对象(字典数组)中获取值?

如何在 graphQL 片段中定义可选字段以进行查询

argparse 可选子解析器(用于 --version)

如果之前有任何为空,则从可选的有序文本框中移动值

带有可选子命令的 argparse 未按预期工作

Json - 可选子文档