我有一个包含20列的表,我希望用每行的最后一列填充此行的值(对于此列)减去同一列的前一行的值。(如果当前行的时间高于前一行的时间,则
update tbl set column_with_differences =
(select case when (a.columnWithValueOnSameRow-b.columnWithValueOnPreviousRow) is null
then a.columnWithValueOnSameRow else a.columnWithValueOnSameRow-b.columnWithValueOnPreviousRow end
as tot
from tbl a left join
tbl b
on a.time > b.time);
具有值和时间的列是varchar(10)。
我收到MySQL错误
ERROR 1093 (HY000): You can't specify target table 'tbl' for update in FROM clause
我知道得到此错误是正常的,因为我在尝试更新表时从中进行选择..
是否有任何方法可以避免出现此错误并实际使用当前行与上一行的差异更新表中的值?
非常感谢。
编辑:
我的不好,我忘了提到我还有一个日期栏,以及每行的唯一ID ......
答案 0 :(得分:1)
这有点复杂。在select
查询中,您可以使用变量或执行以下操作来获取先前的值
select tbl.*,
(select prev.col
from tbl prev
where prev.time < tbl.time
order by time desc
limit 1
) as prev_col
from tbl;
这假设列time
是排序列。然后,您可以再次加入回到此更新,并假设 - time
唯一标识每一行:
update tbl t join
(select tbl.*,
(select prev.col
from tbl prev
where prev.time < tbl.time
order by time desc
limit 1
) as prev_col
from tbl
) tt
on tt.time = t.time
set t.diff = t.col - tt.prev_col;