簡體   English   中英

是否可以在 Postgres 的插入查詢中重用單個子查詢的標量結果?

[英]Is it possible to reuse scalar result from a single subquery in insert query in Postgres?

我想在同一個查詢中的 Postgres DB 表中插入幾行數據,但是需要使用子查詢的標量結果和傳遞的綁定參數來計算其中一列的值。 計算是兩個 Postgres arrays 的串聯。

我可以通過這樣的查詢來做到這一點:

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 insert. . . select 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM