Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 使用许多公共子表达式更新_Postgresql_Sql Update_Database Performance_Code Maintainability - Fatal编程技术网

Postgresql 使用许多公共子表达式更新

Postgresql 使用许多公共子表达式更新,postgresql,sql-update,database-performance,code-maintainability,Postgresql,Sql Update,Database Performance,Code Maintainability,如果一个表中有许多列是从同一个表中的其他列计算出来的,并且公式以复杂的方式彼此建立,那么计算该表的最佳方法是什么 如果您不关心性能,只需使用自己的update语句计算每个列: update x set b1 = a1 + a2; update x set b2 = a3 * b1; update x set b3 = a4 * b2; ... 或者,如果手动展开公式,则可以在一次更新中完成所有操作: update x set b1 = a1 + a2, b2 = a3 * (a1 +

如果一个表中有许多列是从同一个表中的其他列计算出来的,并且公式以复杂的方式彼此建立,那么计算该表的最佳方法是什么

如果您不关心性能,只需使用自己的update语句计算每个列:

update x set b1 = a1 + a2;
update x set b2 = a3 * b1;
update x set b3 = a4 * b2;
...
或者,如果手动展开公式,则可以在一次更新中完成所有操作:

update x set
  b1 = a1 + a2,
  b2 = a3 * (a1 + a2),
  b3 = a4 * (a3 * (a1 + a2));
这里的问题是,这些公式可能会变得庞大且难以更改和调试

在Postgres(或者可能是一般的SQL)中是否有某种方法可以让您在这些情况下同时拥有性能和可维护性

以下是我希望能做的事情:

update x set
  b1 = _b1,
  b2 = _b2,
  b3 = _b3
with
  _b1 = a1 + a2,
  _b2 = a3 * _b1,
  _b3 = a4 * _b2;

我有一个可行的解决方案,其中公式是在一个具有多个返回值的函数中定义的,但这在其他一些方面相当不灵活,因此我正在寻找替代方案。

您可以在最新的PostgreSQL版本中使用以下内容:

UPDATE atable
SET (col1, col2, col3) =
SELECT expr1, expr2, expr3
FROM ...
如果需要在查询中重用计算表达式,可以将
一起使用:

WITH t1(x1) AS (
   SELECT /* complicated */
), t2(x2) AS (
   SELECT /* complicated using t1 */
) ...
SELECT /* final results */

我不确定这是否会使代码更易于阅读,但它避免了使用函数,并且符合标准(我想,没有检查)。

我想出了一些接近我所要的东西:

update x set (b1, b2, b3) = ((
  select b1, b2, b3
  from (select b1, b2, a4 * b2 as b3
  from (select b1, a3 * b1 as b2
  from (select a1 + a2 as b1
  ) as _) as _) as _
));

它仍然比我想要的更详细,但基本上实现了不必扩展公式而不使用函数的目标。

我实际上对您当前的方法没有问题,并且不涉及动态SQL的解决方案可能比它值得做的工作更多。谢谢。我在Postgres文档中看到了这一点,但是我不确定如何将其应用到我的用例中,即在一个表中进行更新,而不涉及任何选择。我的答案只能与您的问题一样具体。