我正在尝试使用以前更新的值在单个查询运行中更新记录。这是一个运行的总案例,但它是一个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没有使用以前更新过的值。
注意:它将是一个非常大的表,所以我使用前一行运行数量计算它,并将值与当前行数量相加,而不是从第一行计算它。
这样做的正确方法是什么?
提前致谢。
答案 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 Server 2008中并不容易,但是你应该可以使用这样的东西:
declare @total int
set @total = 0
update inventory
set runningqty = @total,
@total = @total + qty;
还有其他方法,包括使用游标在sql server 2008中执行此操作。