2012-11-06 3 views
0

Я пытаюсь создать триггер, который обновит мою таблицу заказов с информацией о заказе, которая находится в таблице OrderDetail. Таблица деталей может содержать несколько строк для нескольких элементов в заказе. Они связаны вместе с OrderID. То, что я до сих пор:Trigger to Update Table

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 установил OrderTotal = SUM (SELECT (SELECT OrderTotal Stuff)), но это дает мне синтаксическую ошибку перед первым SELECT.

Это на SQL Server 2000.

EDIT: Я изменил запрос ПОСЛЕ вставки, так как я хочу OrderTotal быть обновлен после любой вставки

второй Edit: я пытаюсь включать вставленной мета-таблицы, так как это должно содержать идентификатор заказа последней вставленной строки, и только одна строка будет вставлена ​​за раз. Теперь, хотя я получаю сообщение об ошибке: «Недостаточно или некорректно указывать информацию о столбцах. Слишком много строк были затронуты обновлением». И, глядя на колонку с порядковым номером, каждая строка в моей таблице обновляется с общей суммой заказа. Поэтому я думаю, что я близок, но я все еще что-то пропущу.

ответ

3

Хорошо, наконец-то выяснилось. Хитрость в конечном итоге с помощью вставленной таблицы 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) 

Основное различие не был я никогда не устанавливая какие-либо условий для update, поскольку я смешивал его с условием запроса SELECT.