0

我正在尝试在单个查询运行中使用以前更新的值来更新记录。这是一个正在运行的总案例,但它是一个 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 没有使用以前更新的值。

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

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

提前致谢。

4

1 回答 1

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

但这在 SQL Server 2008 中并不容易,但是您应该能够使用如下内容:

declare @total int 
set @total = 0

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

请参阅SQL Fiddle with Demo

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

于 2012-12-11T19:05:22.547 回答