首页 > 解决方案 > 可以逐行处理sqlite UPDATE语句以帮助解决“基于列的sqlite计算列”

问题描述

我有一个表,其中包含基于其他计算列的大量计算列。所以有:

x, f(x),g(f(x)),h(g(x)... 等等。每个函数都使用大量的字段,因此从第一原理写出公式既繁琐又错误-易于。

我知道这个使用子查询的解决方案。然而,这变得越来越不切实际,因为列变得基于其他计算的列进行计算,而这些计算列本身也是计算出来的。对于每个级别的计算,您都需要一个子查询。对于像我这样的宽表,这很容易出错。

我想到了一个不同的解决方案,首先用虚拟数字填充计算的列,然后使用 UPDATE 以所需的顺序计算列。

这是一个 MWE(不是真的):

create table a (x ,y,z);
insert into  a(x,y,z)
    values (1,1,1),(2,1,1);
update a
    set y = x, 
    z = 7 * y;
select * from a;

目前这不起作用,并且计算z使用未刷新的 y 值。

为了解决这个问题,我必须分开更新语句

update a
    set y = 3 * x;
update a
    set z = 7 * y;

我的问题:有没有办法告诉 SQLITE 完成 UPDATE 语句中第一行的计算,然后继续,所以我可以将所有计算捆绑在一个 UPDATE 语句下?

标签: sqlitesql-updatecalculated-columns

解决方案


我知道的唯一一个在UPDATE语句中使用表达式中列的更改值的数据库是 MySql。
标准行为是使用存储的值。
在您的情况下,有一个简单的解决方案。
的新值y3 * xso 而不是:

z = 7 * y

利用:

z = 7 * (3 * x)

或者

z = 21 * x

你的陈述将是:

update a
set y = 3 * x, 
    z = 21 * x;

请参阅演示
结果:

| x   | y   | z   |
| --- | --- | --- |
| 1   | 3   | 21  |
| 2   | 6   | 42  |

推荐阅读