【问题标题】:INSERT with multiple return values from optional subquery从可选子查询中插入多个返回值
【发布时间】:2018-09-29 23:44:45
【问题描述】:

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

我的第一次尝试是:

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

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

this question 启发的另一种方法是:

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

但这仅在找到WHERE 子句的内容时才执行INSERT。所以它的行为与真正的子查询不同。所以我想出了这个:

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


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      一种方法:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-05
        • 1970-01-01
        相关资源
        最近更新 更多