sql—是否可以在postgres的insert查询中重用单个子查询的标量结果?

liwlm1x9  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(416)

我想在同一个查询中的postgres db表中插入几行数据,但其中一列的值需要使用子查询的标量结果和传递的绑定参数来计算。计算是两个postgres数组的串联。
我可以通过这样的查询:

INSERT INTO my_table (col1, col2, computed_col)
VALUES 
  (
    :col1Val1,
    :col2val1,
    (SELECT some_col FROM some_table WHERE id = :id) || ARRAY[:computed_col1]::bigint[]
  ),
  (
    :col1Val2,
    :col2val2,
    (SELECT some_col FROM some_table WHERE id = :id) || ARRAY[:computed_col2]::bigint[]
  );

cte也可以工作,但它看起来没有必要,因为我们仍然需要从cte“table”中为每组值选择子查询。
如您所见,对于要插入的每组数据,select子查询是相同的。那么,是否可以指定单个子查询并重用结果而不重复选择子查询,或者是否有其他方法来优化上面的查询?
从性能的Angular 来看,查询会导致什么问题?

gpnt7bae

gpnt7bae1#

你可以用 insert . . . select ,基本上移动 VALUES() 进入 FROM 条款:

INSERT INTO my_table (col1, col2, computed_col)
    SELECT v.col1, v.col2, x.some_col  || v.computed
    FROM (SELECT some_col FROM some_table WHERE id = :id
         ) x CROSS JOIN
         (VALUES (:col1Val1, :col2val1, ARRAY[:computed_col1]::bigint[]),
                 (:col1Val2, :col2val2, ARRAY[:computed_col2]::bigint[])
         ) v(col1, col2, computed);

相关问题