2017-05-24 72 views
0

我正在努力处理以下(显然)简单的任务;我的表(称之为表1)是这样的:SQL查询中的更新表

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 
------------------ 

我想与更换两个0,分别为95和84(即以前的值在时间)。任何解决方案我一直在花时间在这个looot(抱歉,但我很新的SQL)

+2

显示您到目前为止所尝试的内容。你将需要2个更新语句。 1为您想要更新的每个值。 –

+1

只需要进行两个查询,其中ID = 1和Date = 09之后,您更新了一个写入第二个查询,其中ID = 2并且日期= 10它不必是复杂的 – SaggingRufus

+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; 

更改这个

使表1的新副本为表2(在表1和表2相同的结构&相同的数据):

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; 
+0

如果这实际上运行没有错误,它可能是一个有效的方法。 –

+0

已经使用了类似的东西,它不起作用。编辑:也试过这个,它不工作 –

+0

@v_emme:请永远不要说“它没有工作”在这里没有告诉我们究竟发生了什么。你收到错误信息了吗?是否写了不正确的值? –

0

对纳乔的查询构建:

MySQL的更新有点有缺陷。首先:它不接受更新表的别名。第二:当你访问你想在查询中更新的同一张表时,它会发出抱怨。后者可以很容易地通过用from (select * from table1) b代替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

UPDATE:你明明标记错误的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; 
+0

这不起作用,它给:在'限制'附近语法不正确。 –

+0

这是因为您用** MySQL **标记了您的问题,但现在看来您的数据库系统实际上是** SQL Server **,这是另一种产品,它们的SQL方言有所不同。我已经更新了我的答案。 –