我已将问题抽象为以下情况:
我有一个表 ( 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)
现在谈谈问题。我想更新与B
. SL
基本上这是我想要做的,但它在 SQL 中不受支持:
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 中有 2 次引用 A_Id = 2 的记录。这意味着结果需要更新 A_Id = 2 的 4 条 B 记录。