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

Sql 是否可以在Postgres的insert查询中重用单个子查询的标量结果?,sql,database,postgresql,insert,sql-insert,Sql,Database,Postgresql,Insert,Sql Insert,我想在同一查询中的Postgres DB表中插入几行数据,但其中一列的值需要使用子查询的标量结果和传递的绑定参数来计算。计算是两个Postgres数组的串联 我可以通过这样的查询来完成: 插入my_表col1、col2、computed_col 价值观 :col1Val1, :col2val1, 从一些表格中选择一些列,其中id=:id | |数组[:computed_col1]::bigint[] , :col1Val2, :col2val2, 从一些表格中选择一些列,其中id=:id | |

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

我可以通过这样的查询来完成:

插入my_表col1、col2、computed_col 价值观 :col1Val1, :col2val1, 从一些表格中选择一些列,其中id=:id | |数组[:computed_col1]::bigint[] , :col1Val2, :col2val2, 从一些表格中选择一些列,其中id=:id | |数组[:computed_col2]::bigint[] ; CTE也可以工作,但它看起来没有必要,因为我们仍然需要从CTE表中为每一组值选择子查询

如您所见,选择子查询对于要插入的每组数据都是相同的。那么,在不重复SELECT子查询的情况下,是否可以指定单个子查询并重用结果,或者是否有其他方法来优化上述查询

从性能角度来看,查询可能会导致哪些问题?

您可以使用insert。选择,基本上将值移动到FROM子句中:

你可以使用插入。选择,基本上将值移动到FROM子句中:


谢谢您的回答,如果没有解释/分析工具,您认为哪种查询性能更好?@dajnz。性能应该与添加两行无关。如果某个表的id上有一个索引,而id可能是主键,那么如果你能测量性能上的差异,我会感到惊讶。谢谢你的回答,如果没有解释/分析工具,你认为哪种查询性能会更好?当然了!@dajnz。性能应该与添加两行无关。如果某个_表的id上有一个索引,它可能是主键,那么如果您能够度量性能上的差异,我会感到惊讶。
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);