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)
) 

サブクエリが複数の値を返したというエラーが表示されます。これは単一の合計値を返すだけではいけませんか? UPDATE Orders Set OrderTotal = SUM(SELECT (SELECT OrderTotal Stuff)) になるように SUM を追加しようとしましたが、最初の SELECT の前に構文エラーが発生します。

これは SQL Server 2000 上にあります。

編集:挿入後に ordertotal を更新したいので、クエリを AFTER insert に変更しました

2番目の編集:挿入されたメタテーブルを含めようとしています。これには、最後に挿入された行の注文IDが含まれている必要があり、一度に1行しか挿入されないためです。現在、「キー列情報が不十分であるか正しくありません。更新の影響を受けた行が多すぎます」というエラーが表示されます。注文合計列を見ると、テーブルのすべての行がその注文合計で更新されます。だから私は近いと思いますが、まだ何かが欠けています。

4

1 に答える 1

3

さて、ついにそれを理解しました。トリックは、クエリでOrderIDが参照されるすべての場所と更新クエリに挿入されたテーブルの注文IDを使用することになったため、最終的なクエリは次のようになりました。

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クエリの条件と混同していたため、update句の条件を設定していなかったことです。

于 2012-11-06T18:58:21.503 に答える