2012-11-06 3 views
0

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

하위 쿼리가 두 개 이상의 값을 반환했다는 오류가 나타납니다. 이것은 단지 하나의 총 가치를 돌려 주어야하지 않습니까? SUM을 추가하려고 시도했습니다. Order Order = SUM (SELECT (SELECT OrderTotal Stuff)). 그러나 첫 번째 SELECT 전에 구문 오류가 발생했습니다.

이 SQL Server에서 2000

편집이다 : 나는 ordertotal 어떤 삽입 한 후 업데이트가 원하기 때문에 삽입 한 후에 쿼리를 변경 한

두번째 편집 : 난을 포함하기 위해 노력하고있어 가장 최근에 삽입 된 행의 순서 ID가 있어야하며 한 번에 하나의 행만 삽입되므로 메타 테이블이 삽입됩니다. 이제 "키 열 정보가 충분치 않거나 올바르지 않습니다. 너무 많은 행이 업데이트의 영향을받습니다."라는 오류 메시지가 나타납니다. 주문 총계 열을 보면 내 테이블의 모든 행이 해당 주문 총계로 업데이트됩니다. 그래서 나는 가깝다고 생각하지만 나는 여전히 뭔가를 놓치고 있습니다.

답변

3

좋아, 결국 알아 냈어. 트릭은 나의 마지막 쿼리가이처럼 보였다 사방을 위해 삽입 된 테이블의 주문 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 절에 대한 조건과 혼합하기 때문에 update 절을 사용합니다.