在sql查询中更新表

时间:2017-05-24 14:08:37

标签: sql-server

我正在努力完成以下(显然)轻松的任务;我的表(称之为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很新)

2 个答案:

答案 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;