2012-12-11 69 views
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服務器沒有使用以前更新值。

注意:這將是一個非常大的表,所以我使用上一行的運行數量計算它,並將該值與當前行數量相加,而不是從第一行計算它。

這樣做的正確方法是什麼?

在此先感謝。

回答

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中使用遊標執行此操作。