【问题标题】:The aggregate expression cannot be used in the WHERE clauseWHERE 子句中不能使用聚合表达式
【发布时间】:2019-05-16 20:31:54
【问题描述】:

我的数据库中有以下表格:

第一个表名为Amount,第二个名为Product,第三个名为Purchase

我应该在插入金额表时创建触发器。例如,我将插入以下值:4、1、10,其中 4 是 id_purchase,1 是 id_product,4 是该产品的数量。触发器应该从Amount_On_Stock 中减去这个数量。在我的例子中,应该是:原来是 48,变成了 38。

这是我的触发器的代码:

CREATE TRIGGER AmountInsert ON Amount
AFTER INSERT
AS
BEGIN
    UPDATE Product
    SET Amount_On_Stock = (
            SELECT 
                Amount_On_Stock 
            FROM Product
            WHERE ID_Product = (
                SELECT 
                    MAX(ID_Product) 
                FROM Purchase
                WHERE ID_Purchase = (
                    SELECT 
                        MAX(ID_Purchase) 
                    FROM Purchase
                )
            )
        )-(
            SELECT 
                Amount 
            FROM AMOUNT
            WHERE ID_Product = (
                SELECT 
                    MAX(ID_Product) 
                FROM Purchase
                WHERE ID_Purchase = (
                    SELECT 
                        MAX(ID_Purchase) 
                    FROM Purchase
                )
            )
            )
END

但是当我尝试创建此触发器时,出现以下错误:

聚合表达式不能在 WHERE 子句中使用,除非它 包含在 HAVING 子句的子查询或选择列表中, 并且正在聚合的列不是外部引用。

那么,我该如何解决这个问题呢?

【问题讨论】:

  • 这不是和你之前的问题(stackoverflow.com/questions/56158300/…)一样,已经有了可能的答案吗?您仍然没有使用 inserteddeleted 伪表。
  • 该代码不可读。所有这些子查询并排在一起,您无法分辨一个结束和下一个开始的位置。并且有多个子查询可以一遍又一遍地获取相同的值。您应该了解连接的工作原理。这太复杂了。

标签: sql sql-server triggers


【解决方案1】:

您的触发器看起来一点也不像 SQL Server 触发器。我希望您的触发器看起来更像这样:

CREATE TRIGGER AmountInsert ON Amount AFTER INSERT
AS
BEGIN
    UPDATE p
        SET Amount_On_Stock = p.Amount_On_Stock - i.amount
        FROM Product p JOIN
             inserted i
             ON p.ID_Product = i.ID_Product;
END;

但是,如果您在同一产品上同时有多个 inserts,这将不正确。要处理,您需要聚合:

CREATE TRIGGER AmountInsert ON Amount AFTER INSERT
AS
BEGIN
    UPDATE p
        SET Amount_On_Stock = p.Amount_On_Stock - i.amount
        FROM Product p JOIN
             (SELECT i.ID_Product, SUM(i.amount) as amount
              FROM inserted i
              GROUP BY i.ID_Product
             ) i
             ON p.ID_Product = i.ID_Product;
END;

【讨论】:

猜你喜欢
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
  • 1970-01-01
相关资源
最近更新 更多