Выберите только SUM(sale.quantity * item.price)
в своем подзапросе и удалите select total
один.
update Transaction
set total = (
select SUM(sale.quantity * Item.price)
from Sale
inner join Item on Sale.I_ID = Item.I_ID
where Sale.T_ID = Transaction.T_ID
)
Это то, что я бы попробовал в SQL Server.
Я бы предпочел иметь некоторые примеры данных, чтобы я мог проверить их на моей локальной базе данных SQL Server, чтобы проверить, выполняет ли этот оператор то, что ожидается, хотя вы не используете SQL Server, идея все еще остается то же самое.
РЕДАКТИРОВАТЬ # 1
Несмотря на то, что я не до конца понимаю, почему он не перезаписывает значения в столбцеaction.total, когда транзакция состоит из нескольких различных элементов, предложенный вами запрос работает.
Поведение функции SUM
заключается в суммировании всех целевых записей, в результате чего получается только одно скалярное значение для каждой строки Sale
и Item
. Может быть только одна сумма, не так ли?
При этом он умножает каждую результирующую строку на ограничение, то есть для конкретной транзакции.
- Для этой самой транзакции выбираются строки
Sale
и Item
;
- Затем он перебирает каждую полученную строку и умножает
Sale.Quantity
и Item.Price
вместе, что стоит значение для каждой строки;
- После умножения строки ее сумма добавляется к сумме, которая хранится где-то в памяти;
- Как только он обработает все строки для этой транзакции, он получит скалярное значение, которое является суммой всех строк в
Sale
и Item
для данной данной транзакции;
- Сумма, равная сумме транзакции.
Другими словами, подзапрос «знает», какую транзакцию суммировать, которая фильтруется в самом подзапросе. Таблица Transaction
доступна в подзапросе как часть основного оператора SQL. Таким образом, включение его в предложение where
позволяет отфильтровать строки из Sale
и Item
, которые впоследствии будут умножены и добавлены для итоговой суммы.
Помогает ли это вам лучше понять это заявление об обновлении?
Пожалуйста, не стесняйтесь задавать свои вопросы. =) * * Тысяча пятьдесят одна