我正在尝试创建一个触发器,它将使用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,并且一次只能插入一行。现在虽然我收到一条错误,说“密钥列信息不足或不正确。太多行受更新影响”。查看订单总计列,我表中的每一行都会更新订单总数。所以我觉得我很接近,但我仍然缺少一些东西。
答案 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查询的条件混合在一起。