基于Zohar's answer 的轻微调整 - 我们的目的是根据这些购买降低库存水平,而不是提高。但是我们还需要考虑当更新处理相同ProductID 的多行时会发生什么。所以在应用更新之前我们还需要做一些聚合:
CREATE TRIGGER [dbo].[Trg_PurchaseDetails_After_Update] ON [dbo].[PurchaseDetails]
FOR UPDATE
AS
BEGIN
UPDATE P
SET Rate = I.SallingPrice,
Stock = Stock - (I.Quantity - D.Quantity)
FROM Product P
INNER JOIN
(SELECT ProductID,SUM(Quantity) as Quantity,
MAX(SallingPrice) as SallingPrice from Inserted group by ProductID) I
ON P.ProductID = I.ProductID
INNER JOIN
(SELECT ProductID,SUM(Quantity) as Quantity from deleted group by ProductID) D
on P.ProductID = D.ProductID
END
还请注意,我假设从每个产品的所有更新值中获取最大 SallingPrice 值是正确的。如果这不正确,我们需要一个更清晰的规范,说明对于影响具有相同 ProductID 值的多行的更新应该发生什么。
正如 Zohar 的回答下面所评论的那样,您的条件逻辑不必要地令人费解,因为 4 - (5 - 7) 和 4 + (7 - 5) 产生相同的结果,因此无需在括号内切换减法并切换外部运算符。
要理解我所说的聚合需求,请考虑以下脚本(使用Siddique's answer):
create table dbo.Product (
ProductID int not null primary key,
Stock int not null,
Rate int not null
)
go
insert into dbo.Product(ProductID,Stock,Rate) values (1,49,5)
go
create table dbo.PurchaseDetails (
DetailsID int not null primary key,
ProductID int not null,
Quantity int not null,
SallingPrice int not null)
go
insert into dbo.PurchaseDetails (DetailsID,ProductID,Quantity,SallingPrice) values
(1,1,10,5),
(2,1,20,10)
go
CREATE TRIGGER [dbo].[Trg_After_Update] ON [dbo].[PurchaseDetails]
FOR UPDATE
AS
BEGIN
UPDATE Product SET Rate = I.SallingPrice,
Stock = (CASE
WHEN I.Quantity > D.Quantity
THEN (Stock - (I.Quantity - D.Quantity))
WHEN I.Quantity < D.Quantity
THEN (Stock + (D.Quantity - I.Quantity))
END)
FROM inserted I Inner join deleted D on I.DetailsID = D.DetailsID AND I.ProductID = D.ProductID
Where Product.ProductID = I.ProductID
END
go
update PurchaseDetails set Quantity = Quantity + 5
go
select * from Product
select * from PurchaseDetails
结果是:
ProductID Stock Rate
----------- ----------- -----------
1 44 10
DetailsID ProductID Quantity SallingPrice
----------- ----------- ----------- ------------
1 1 15 5
2 1 25 10
Stock 已经调整了 5 - 但我们实际上调整了两行,并且 Stock 总数应该改变了 10,而不是 5。