我想在同一查询的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“表”中的SELECT子查询,因此它看起来没有必要。
您可以看到SELECT子查询对于要插入的每组数据都是相同的。因此,是否有可能以某种方式指定单个子查询并重用结果而无需重复SELECT子查询,或者也许还有其他方法可以优化上面的查询?
从性能的角度来看,查询可能导致什么问题?
您可以使用insert . . . select
,基本上将VALUES()
移到FROM
子句中: