1

我想用另一个表中的参数和一些可选值做一个 INSERT。(可选的意思是如果子查询失败,我只想插入参数值而不是什么都不插入。)

我的第一次尝试是:

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

但没有用。错误消息是“子选择必须只有一个字段”。

受这个问题启发的另一种方法是:

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

但这仅执行INSERTif 它为该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));

哪个有效,但由于两个子选择,当然看起来不必要的慢。

所以我的问题是:我能以某种方式让它只与一个子选择一起工作吗?

4

2 回答 2

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 个结果,您实际上确实希望为所有结果插入相同的参数)。

于 2018-04-19T13:07:15.420 回答
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
于 2018-04-19T13:14:30.793 回答