2010-08-12 2 views
25

У меня есть 3 таблицы (упрощенный):SQL Server с внутренним соединением

tblOrder(OrderId INT) 
    tblVariety(VarietyId INT,Stock INT) 
    tblOrderItem(OrderId,VarietyId,Quantity INT) 

Если я размещаю заказ, я не уронить уровень запасов с помощью этого:

UPDATE tblVariety 
SET tblVariety.Stock = tblVariety.Stock - tblOrderItem.Quantity 
FROM tblVariety 
INNER JOIN tblOrderItem ON tblVariety.VarietyId = tblOrderItem.VarietyId 
INNER JOIN tblOrder ON tblOrderItem.OrderId = tblOrder.OrderId 
WHERE tblOrder.OrderId = 1 

Все нормально, до тех пор, являются двумя строками в tblOrderItem с тем же VarietyId для того же OrderId. В этом случае для обновления запасов используется только одна из строк. Кажется, что-то делает GROUP BY VarietyId.

Может ли кто-нибудь пролить свет? Большое спасибо.

+0

Если это невозможно, чтобы иметь такую ​​же комбинацию Variety/Order? То есть, если одно и то же Variety появляется> 1 для заказа, то это фиксируется в столбце Количество, а не в нескольких строках? – gbn

+0

Технически, да. Но есть и другие столбцы в tblOrderItem, что означает, что более чем одна строка может содержать те же базовые номера (например, поле даты) – Geoff

ответ

43

Мое предположение заключается в том, что, поскольку вы показали нам упрощенную схему, отсутствует какая-либо информация, которая определяла бы причину повторяющихся значений VarietyID для данного OrderID.

Если у вас несколько строк, SQL Server будет выбирать один из них для обновления.

Если это так, то вам нужно сгруппировать первый

UPDATE V 
SET 
    Stock = Stock - foo.SumQuantity 
FROM 
    tblVariety V 
    JOIN 
    (SELECT SUM(Quantity) AS SumQuantity, VarietyID 
    FROM tblOrderItem 
     JOIN tblOrder ON tblOrderItem.OrderId = tblOrder.OrderId 
    WHERE tblOrder.OrderId = 1 
    GROUP BY VarietyID 
    ) foo ON V.VarietyId = foo.VarietyId 

Если нет, то ТоварыЗаказа таблице PK является неправильным, потому что если позволяет дублировать комбинации OrderID/VarietyID (рк должен быть OrderID/VarietyID, или они должны быть ограничены уникальным)

+0

Большое спасибо gbn - это сделало это для меня ... – Geoff

+0

+1 для разработки всех путь. – Tobiasopdenbrouw

+1

+100 @gbn Я вам пива. –

1

Вы делаете обновление. Он будет обновляться один раз.

Редактировать: Чтобы решить, вы можете добавить в подзапрос, который будет группировать ваши orderitems посредством orderid и multipid, с суммой на сумму.

12

Из документации UPDATE

результаты оператора UPDATE являются не определен, если оператор включает в себя FROM пункта, не указанных в таким образом, что только одно значение доступно для каждого случая столбца , который обновляется (другими словами, если оператор UPDATE не детерминированный). Например, если оператор UPDATE в следующем сценария, обе строки в таблице s соответствует квалификации ЕКА в UPDATE заявления, но это не определен, какая строка из й используется для обновления строки в таблице t.

CREATE TABLE s (ColA INT, ColB DECIMAL(10,3)) 
GO 
CREATE TABLE t (ColA INT PRIMARY KEY, ColB DECIMAL(10,3)) 
GO 
INSERT INTO s VALUES(1, 10.0) 
INSERT INTO s VALUES(1, 20.0) 
INSERT INTO t VALUES(1, 0.0) 
GO 
UPDATE t 
SET t.ColB = t.ColB + s.ColB 
FROM t INNER JOIN s ON (t.ColA = s.ColA) 
GO 
Смежные вопросы