触发更新表

时间:2012-11-06 16:42:43

标签: triggers sql-server-2000

我正在尝试创建一个触发器,它将使用OrderDetail表中的订单信息更新我的订单表。详细信息表可以为订单中的多个项目提供多行。这些由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上。

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

第二次编辑:我正在尝试包含插入的元表,因为它应包含最新插入行的订单ID,并且一次只能插入一行。现在虽然我收到一条错误,说“密钥列信息不足或不正确。太多行受更新影响”。查看订单总计列,我表中的每一行都会更新订单总数。所以我觉得我很接近,但我仍然缺少一些东西。

1 个答案:

答案 0 :(得分:3)

好的,终于搞清楚了。最后使用Inserted表的Order ID,在查询和Update Query中引用了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)

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