問題を次の状況に抽象化しました。
更新したいアイテムA
の数 ( ) を含むテーブル ( ) があります。Quantity
次に、選択する必要があるテーブル ( )SL
への参照を含むテーブル ( A
) があります。最後に、更新する必要があるテーブル ( B
)
CREATE TABLE A
(
Id int,
Quantity int
)
CREATE TABLE SL
(
Id int,
A_Id int,
S_Id int
)
CREATE TABLE B
(
Id int,
StatusValue int,
A_Id int,
S_Id int NULL,
)
それでは、テスト目的でいくつかのデータを挿入しましょう。
INSERT INTO A Values (1, 4), (2, 2), (3, 3), (4, 4), (5, 2)
delete from B
declare @i int = 1;
declare @j int = 0;
declare @maxA int = 5;
declare @rows_to_insert int = 10;
while @i < @maxA
begin
while @j < @rows_to_insert * @i
begin
INSERT INTO B VALUES (10+@j, 0, @i, null)
set @j = @j + 1
end
set @i = @i + 1
end
select * from B
INSERT INTO SL Values (1, 1, 1), (2, 2, 1), (3 ,2, 1)
そして、問題に移ります。のレコードに関連する のレコードのTOP(数量)を更新したい。基本的にこれは私がやりたいことですが、SQLではサポートされていません:B
SL
DECLARE @Sale_Id int = 1;
WITH AB (AId, AQuantity, SaleId)
AS
(
SELECT A.Id, A.Quantity, SL.S_Id FROM A
INNER JOIN SL on A.Id = SL.A_Id
WHERE SL.S_Id = @Sale_Id
)
UPDATE TOP(AB.Quantity) B
SET StatusValue = 1,
S_Id = AB.SaleId
FROM AB
WHERE StatusValue = 0 -- Edited
AND B.A_Id = AB.AId
エラーメッセージは
メッセージ 4104、レベル 16、状態 1、行 55 マルチパート識別子「AB.Quantity」をバインドできませんでした。
これを行うための私のオプションは何ですか?(常にありますが、Cursor
それは良いオプションですか?)
注:このデータには、SL に A_Id = 2 を参照するレコードが 2 回あるという面白い側面があります。これは、A_Id = 2 が更新された 4 つの B レコードが結果に必要であることを意味します。