如何基于其他表的乘积总和更新Order1表的Total Price列?
问题描述
我有三张表:Order1、Contains、Product,需要计算Order1中每个订单的总价(该订单下所有产品的数量×价格之和),并将计算结果更新到Order1的Total Price列。
各表结构如下:
Order1表
| Order_ID | Total Price |
|---|---|
| 1 | NULL |
| 2 | NULL |
Contains表
| Order_ID | Barcode | Quantity |
|---|---|---|
| 1 | 12 | 2 |
| 1 | 34 | 1 |
| 2 | 56 | 4 |
Product表
| Barcode | Price |
|---|---|
| 12 | 5 |
| 34 | 1 |
| 56 | 6 |
我已经能通过以下查询语句生成包含Order_ID和对应总价的结果集,但不知道如何用UPDATE语句把结果更新到Order1表:
SELECT ORDER1.ORDER_ID, SUM(Quantity*Selling_Price) AS "Total" FROM PRODUCT, IS_PRESENT_IN, Order1 WHERE PRODUCT.BARCODE = IS_PRESENT_IN.BARCODE AND ORDER1.ORDER_ID = IS_PRESENT_IN.ORDER_ID GROUP BY order1.ORDER_ID ORDER BY SUM(Quantity*Selling_price) ;
解决方案
可以通过UPDATE结合子查询/关联查询的方式实现,根据不同SQL方言提供两种常用写法:
写法一:关联查询式UPDATE(适配MySQL、PostgreSQL等)
UPDATE Order1 o JOIN ( SELECT c.Order_ID, SUM(c.Quantity * p.Price) AS total_price FROM Contains c JOIN Product p ON c.Barcode = p.Barcode GROUP BY c.Order_ID ) calc ON o.Order_ID = calc.Order_ID SET o.`Total Price` = calc.total_price;
写法二:子查询赋值式UPDATE(适配SQL Server等)
UPDATE Order1 SET [Total Price] = ( SELECT SUM(c.Quantity * p.Price) FROM Contains c JOIN Product p ON c.Barcode = p.Barcode WHERE c.Order_ID = Order1.Order_ID ) WHERE EXISTS ( SELECT 1 FROM Contains c WHERE c.Order_ID = Order1.Order_ID );
补充说明
- 你原查询中的
IS_PRESENT_IN应为笔误,已替换为实际的Contains表 - 子查询部分负责计算每个订单的总价,通过
Order_ID与Order1表关联后更新对应字段 WHERE EXISTS子句用于避免更新无对应产品的订单,防止NULL覆盖原有有效数据
内容的提问来源于stack exchange,提问作者CoffeeBean
相关产品推荐
相关产品推荐

