我正在努力完成以下(显然)轻松的任务;我的表(称之为table1)看起来像这样:
id | date | value
------------------
1 | 01 | 100
1 | 02 | 103
1 | 04 | 105
1 | 05 | 90
1 | 06 | 95
1 | 09 | 0
2 | 02 | 110
2 | 03 | 98
2 | 04 | 97
2 | 07 | 71
2 | 08 | 84
2 | 10 | 0
------------------
我想用95和84(即先前的时间值)替换两个0。有解决方案吗我花了很多时间在这上面(抱歉,我对SQL很新)
答案 0 :(得分:1)
试试这个:
update table1 as a
set a.value=(select b.value
from table1 as b
where b.date<=a.date order by b.date desc limit 1)
where a.value=0;
更改为
将table1的新副本作为table2(table1和table2中的相同结构和相同数据):
SET SQL_SAFE_UPDATES = 0;
update table1
set value=(select value
from table2
where table2.date<table1.date order by table2.date desc limit 1)
where table1.value=0;
答案 1 :(得分:0)
建立在nacho的查询上:
MySQL的更新有点缺陷。第一:它不接受更新表的别名。第二:当您访问要在查询中更新的同一个表时,它会抱怨。通过将from table1 b
替换为from (select * from table1) b
来轻松解决后者问题。
nacho的声明也错过了让子查询引用相同的ID。他错误地将记录包括在内(b.date <=
而不是b.date <
)。
update table1
set value =
(
select b.value
from (select * from table1) b
where b.id = table1.id and b.date < table1.date
order by b.date desc limit 1
)
where value = 0;
这是一个测试:http://rextester.com/YQV55035
更新:您显然标记了错误的DBMS。以下是SQL Server的相同查询:
update table1
set value =
(
select top(1) b.value
from table1 b
where b.id = table1.id and b.date < table1.date
order by b.date desc
)
where value = 0;