首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delete触发器with Update Subquery语句with Multirow

Delete触发器with Update Subquery语句with Multirow
EN

Stack Overflow用户
提问于 2020-10-19 14:11:18
回答 1查看 57关注 0票数 0

此触发器适用于单行delete,但适用于多行

代码语言:javascript
复制
CREATE TRIGGER [dbo].[AfterDeleteStockUpdate] 
ON [dbo].[ItemLedger]
AFTER DELETE
AS 
    DECLARE @productId uniqueidentifier

    SELECT @productId = del.Product 
    FROM deleted del;

    UPDATE products 
    SET inStock = (SELECT SUM(ISNULL(inQty, 0)) - SUM(ISNULL(outQty, 0)) 
                   FROM itemledger 
                   WHERE product = @productId), 
        PurchasedValue = (SELECT SUM(ISNULL(PurchaseAmount, 0)) - SUM(ISNULL(Amount, 0)) 
                          FROM itemledger 
                          WHERE product = @productId) 
    WHERE id = @productId
EN

回答 1

Stack Overflow用户

发布于 2020-10-19 14:20:56

Deleted伪表中可以有0-N行,您需要对其进行处理。像所有的T-SQL一样,您希望尽可能使用完全基于集合的方法,因为这是SQL Server优化的目标。

我相信下面这些应该可以实现你想要的效果。

代码语言:javascript
复制
CREATE TRIGGER [dbo].[AfterDeleteStockUpdate] 
ON [dbo].[ItemLedger]
AFTER DELETE
AS
BEGIN
    SET NOCOUNT ON;

    UPDATE P SET
      inStock = L.inStock
      , PurchasedValue = L.PurchasedValue
    FROM Products P
    INNER JOIN (
        SELECT SUM(ISNULL(L.inQty, 0)) - SUM(ISNULL(L.outQty, 0)) inStock
            , SUM(ISNULL(L.PurchaseAmount, 0)) - SUM(ISNULL(L.Amount, 0)) PruchasedValue
        FROM itemledger L
        GROUP BY L.product
    ) L ON L.product = P.id
    WHERE P.id IN (SELECT Product from Deleted);

END;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64422000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档