我有一个表,其中包含大量基于其他计算列的计算列。所以有:
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语句下?
我知道的唯一一个在UPDATE
语句中使用表达式中列的更改值的数据库是 MySql。
标准行为是使用存储的值。
在您的情况下,有一个简单的解决方案。y
的新值是3 * x
所以,而不是:
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 |