使用以前更新的值更新

时间:2012-12-11 16:13:23

标签: sql-server-2008

我正在尝试使用以前更新的值在单个查询运行中更新记录。这是一个运行的总案例,但它是一个UPDATE查询而不是SELECT查询。

广告资源(简体)

Id Qty RunningQty ItShouldBeUpdatedTo InsteadItsUpdatedTo
1  200 0          200                 200
2  300 0          500                 300
3  400 0          900                 400
4  100 0          1000                100

我当前的查询是这样的

UPDATE Inventory
SET RunningQty = ISNULL(A.RunningQuantity, 0) + Quantity
FROM Inventory I
OUTER APPLY
(
    -- Take previous row RunningQty
    SELECT TOP 1 RunningQty
    FROM Inventory
    WHERE Id < I.Id
    ORDER BY Id DESC
) A

似乎更新了下一行,sql server没有使用以前更新过的值。

注意:它将是一个非常大的表,所以我使用前一行运行数量计算它,并将值与当前行数量相加,而不是从第一行计算它。

这样做的正确方法是什么?

提前致谢。

1 个答案:

答案 0 :(得分:0)

让我先说一下,在SQL Server 2012中这将更容易做到。在那个版本中你可以使用这样的东西:

update i1
set i1.runningqty = i2.RunningQty
from inventory i1
inner join
(
  select id, SUM(qty) OVER(ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) RunningQty
  from inventory
) i2  
  on i1.id = i2.id;

请参阅SQL Fiddle with Demo

但是在SQL Server 2008中并不容易,但是你应该可以使用这样的东西:

declare @total int 
set @total = 0

update inventory
set runningqty = @total, 
  @total = @total + qty;

SQL Fiddle with Demo

还有其他方法,包括使用游标在sql server 2008中执行此操作。