Обновление количества запасов на основе заказов с использованием SQL

#sql #sql-server

#sql #sql-сервер

Вопрос:

У меня возникли проблемы с созданием инструкции SQL, которая будет обновлять таблицу запасов каждый раз, когда я добавляю заказ в таблицу заказов с помощью кнопки.

Таблица заказов

ID orderid разнообразие вес Количество Цена
1 J1 Родной цыпленок 1.6 10 120
2 J2 Цыпленок-бройлер 2.3 5 100
3 J3 Утка 1.6 2 250
4 J4 Турция 1.6 4 350

Таблица запасов

ID разнообразие вес Количество Цена
11 Родной цыпленок 1.6 20 120
12 Цыпленок-бройлер 2.3 15 100
13 Утка 1.6 5 250
14 Турция 1.6 9 350
15 Родной цыпленок 1.9 20 120
16 Цыпленок-бройлер 2.5 15 100
17 Утка 1.7 5 250
18 Турция 4.7 9 350

Ожидаемый результат

ID разнообразие вес Количество Цена
11 Родной цыпленок 1.6 10 120
12 Цыпленок-бройлер 2.3 10 100
13 Утка 1.6 3 250
14 Турция 1.6 5 350
15 Родной цыпленок 1.9 20 120
16 Цыпленок-бройлер 2.5 15 100
17 Утка 1.7 5 250
18 Турция 4.7 9 350

это код, который я пытаюсь использовать с помощью запроса в Visual Studio, и каждый раз, когда я его запускаю, количество продолжает уменьшаться.

 UPDATE Inventory
SET Quantity = TableA.Quantity - TableB.Quantity

FROM Inventory AS TableA JOIN tblOrders AS TableB ON TableA.Variety = TableB.Variety

WHERE
TableA.Variety = TableB.Variety
AND
TableB.Weight = TableB.Weight
 

Комментарии:

1. Какую СУБД вы используете? (ОБНОВЛЕНИЕ синтаксиса зависит от продукта.)

2. @jarlh, я использую SQL Server для этого.

Ответ №1:

В стандартном SQL вы можете использовать:

 update inventory
    set quantity = quantity -
                   (select sum(o.quantity)
                    from orders o
                    where o.variety = inventory.quality and
                          o.weight = inventory.weight
                   )
    where exists (select 1
                  from orders o
                  where o.variety = inventory.quality and
                        o.weight = inventory.weight
                 );
 

Многие базы данных имеют более сжатые способы выражения этой логики. Но в вашем вопросе не указана конкретная база данных.

Например, в SQL Server вы можете использовать:

 update i
    set quantity = i.quantity - o.quantity
    from inventory i join
         (select o.variety, o.weight, sum(quantity) as quantity
          from orders o
          group by o.variety, o.weight
         ) o
         on o.variety = inventory.quality and
            o.weight = inventory.weight
 

Комментарии:

1. Я получаю эту ошибку с многосоставным идентификатором «tblOrders.Variety», «tblOrders. Вес», «Запасы.Количество», «Запасы. Не удалось привязать «Вес». `

2. @alexatorrento . , , Вам нужно ввести в запрос фактические имена таблиц. Идентификаторы в этом ответе основаны на вашем вопросе .

3. я ввел имена таблиц, но это ошибка, которую я получаю: (