0

1回のクエリ実行で以前に更新された値を使用してレコードを更新しようとしています。これは現在の合計ケースですが、SELECTクエリではなくUPDATEクエリです。

テーブルインベントリ(簡略化)

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サーバーは以前に更新された値を使用していません。

注:これは非常に大きなテーブルになるため、最初の行から計算するのではなく、前の行の実行量を使用して計算し、現在の行の量で値を追加します。

これを行う正しい方法は何ですか?

前もって感謝します。

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 FiddlewithDemoを参照してください

ただし、SQL Server 2008ではそれほど簡単ではありませんが、次のようなものを使用できるはずです。

declare @total int 
set @total = 0

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

SQL FiddlewithDemoを参照してください。

SQLServer2008でこれを実行するためにカーソルを使用することを含む他の方法があります。

于 2012-12-11T19:05:22.547 に答える