postgresql - 使用许多常见的子表达式进行更新

标签 postgresql sql-update database-performance code-maintainability

计算表的最佳方法是什么,其中许多列是根据同一表中的其他列计算的,并且公式以复杂的方式相互构建。

如果您不关心性能,您可以简单地计算每个列并使用其自己的更新语句:

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:

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

我不确定这是否会使代码对您来说更具可读性,但它避免使用函数并且符合标准(我认为,没有检查)。

关于postgresql - 使用许多常见的子表达式进行更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54825314/

相关文章:

sas - 过程 sql : Copy one single row from one table to all rows in another table

sql-server - SQL Server - JOIN 未在 Entity Framework 生成的查询中使用最佳顺序

c# - Linq group by property 表现

postgresql - 如何通过Docker修改PostgreSQL的挂载点?

sql - 使用 SQL 批量更新记录

新列的 Postgresql 更新缓慢

mysql - 如何更新数据库记录并仍然保留 MySQL 中的旧值?

c# - Entity 6 + PostgreSQL - 糟糕的性能

sql - PostgreSQL - 所有者数据存储在哪里?

optimization - PostgreSQL:如何优化我的数据库以存储和查询一个巨大的图形