私はユーザーの在庫ステータスを計算するストアドプロシージャを作成しています。SQL在庫と取引に基づく残高の計算
id_inventory id_user 0 1 2 3
------------ ------- - - - -
2 4 5 0 14 21
そしてもう一つは、私が希望する各列の残りの在庫状況を計算するための方法ですuser_transactions
id_tran id_user 0 1 2 3
------- ------- - - - -
54 4 1 0 3 7
55 4 2 0 9 8
56 4 1 0 2 4
と呼ば:
次の表を想像してみては、多くの番号の列を持つuser_inventory
と呼ばれますすべてのユーザートランザクションの合計を減算した後、次のようになります。
id_availableInventory id_user 0 1 2 3
--------------------- ------- - - - -
2 4 1 0 0 2
追加の障害物は、I)は、(whileループを使用して、動的SQLとSUMを使用して、一度に1つの列を更新しようとしたが、範囲と性能の両方を持っていた0から499
に標識された列があるということですそれがこの問題の良いアプローチであるかどうかはわかりません。私は、これはMust declare the scalar variable "@amount".
複数回返された2012年
DECLARE @counter int
DECLARE @userid int
DECLARE @amount int
DECLARE @sum int
declare @sql nvarchar(1000)
SET @counter = 0
SET @userid = 4
WHILE @counter < 500
BEGIN
set @sql = 'SELECT @amount = [' + CAST(@counter AS nvarchar) + '] FROM user_inventory WHERE ID_User = ' +CAST(@userid AS nvarchar)
EXEC(@sql)
set @sql = 'SELECT @sum = SUM([' + CAST(@counter AS nvarchar) + ']) FROM user_transactions WHERE ID_User = ' +CAST(@userid AS nvarchar)
EXEC(@sql)
set @sql = 'UPDATE user_availableinventory SET [' + CAST(@counter AS nvarchar) + '] = @amount - @sum WHERE ID_User = ' +CAST(@userid AS nvarchar)
EXEC(@sql)
SET @counter = @counter + 1
END
SQL Serverを使用しています。 私はこれが醜いアプローチであることを認識しています。この問題に対する提案は非常に感謝しています。
内部変数を宣言することによって、これを試すことができますが、私にとっては悪夢にかなり近いです。データ構造を修正する必要があります。それらの列に入るものは、おそらく別々の行にあるはずです。 –
したがって、この構造の代わりに、 "id、inventoryID、amount"のような列を持つユーザーアカウントあたり500行のものが、より高速で優れたものになりますか? –
これは、リレーショナルデータベースの合理的なデータ構造に似ているものではありません。列0,1,2,3なぜあなたがループでこれをやっているのかわからない。これは単一の更新ステートメントでなければなりません。このデータ構造を修正するか、noSQLタイプのストレージを使用することを検討する必要があります。 –