0

我正在尝试创建一个触发器,该触发器将使用 OrderDetail 表中的订单信息更新我的 Orders 表。明细表可以为订单中的多个项目包含多行。这些通过 OrderID 链接在一起。到目前为止,我所拥有的是:

CREATE TRIGGER AfterOrderDetailInsert ON OrderDetail 
AFTER INSERT AS
UPDATE Orders 
SET OrderTotal = (
    SELECT (
        SELECT Sum(orderdetail.quantity * OrderDetail.Price * 
            ( 1.0 -OrderDetail.ItemDiscount / 100.0 )
        )
        FROM orderdetail 
        WHERE OrderDetail.OrderId = Orders.OrderId
    ) * 
    ( 1 - Orders.OrderDiscount / 100.0 ) * 
    ( 1.0 - Orders.CustomerDiscount / 100.0 )     
    FROM OrderDetail 
    INNER JOIN Orders on OrderDetail.OrderID=Orders.OrderID 
    WHERE OrderDetail.OrderID IN (SELECT OrderID FROM Inserted)
) 

我现在收到一个错误,说子查询返回了超过 1 个值。这不应该只返回一个总值吗?我尝试添加 SUM 以使其 UPDATE Orders Set OrderTotal = SUM(SELECT (SELECT OrderTotal Stuff)),但这在第一个 SELECT 之前给了我一个语法错误。

这是在 SQL Server 2000 上。

编辑:我已将查询更改为插入后,因为我希望在任何插入后更新 ordertotal

第二次编辑:我正在尝试包含插入的元表,因为它应该包含最新插入行的订单 ID,并且一次只能插入一行。现在虽然我收到一条错误消息,提示“键列信息不足或不正确。更新影响了太多行”。查看订单总额列,我表中的每一行都会更新为该订单总额。所以我想我已经接近了,但我仍然缺少一些东西。

4

1 回答 1

3

好吧,终于弄明白了。该技巧最终使用 Inserted 表的 Order ID 用于查询中引用 OrderID 的所有地方以及更新查询,因此我的最终查询如下所示:

CREATE TRIGGER AfterOrderDetailInsert ON OrderDetail 
AFTER INSERT AS
UPDATE Orders 
SET OrderTotal = (
SELECT (
    SELECT Sum(orderdetail.quantity * OrderDetail.Price * 
        ( 1.0 -OrderDetail.ItemDiscount / 100.0 )
    )
    FROM orderdetail 
    WHERE OrderDetail.OrderId = Orders.OrderId AND OrderDetail.OrderID in
   (SELECT TOP 1 OrderID From Inserted)) * 
( 1 - Orders.OrderDiscount / 100.0 ) * 
( 1.0 - Orders.CustomerDiscount / 100.0 )     
FROM OrderDetail 
INNER JOIN Orders on OrderDetail.OrderID=Orders.OrderID 
INNER JOIN INSERTED on Orders.OrderID=Inserted.OrderID
) WHERE Orders.OrderID IN (SELECT TOP 1 OrderID FROM Inserted)

主要区别是我从未为更新子句设置任何条件,因为我将它与 SELECT 查询的条件混合在一起。

于 2012-11-06T18:58:21.503 回答