SQL:是否按字段的相关行更新字段?
我有以下模式: 产品:SQL:是否按字段的相关行更新字段?,sql,Sql,我有以下模式: 产品: id: int pk ai title: string available: int left: int id: int pk ai status: int id: int pk ai order_id: int fk Order.id product_id: int fk Product.id amount: int 订单: id: int pk ai title: string available: int
id: int pk ai
title: string
available: int
left: int
id: int pk ai
status: int
id: int pk ai
order_id: int fk Order.id
product_id: int fk Product.id
amount: int
订单:
id: int pk ai
title: string
available: int
left: int
id: int pk ai
status: int
id: int pk ai
order_id: int fk Order.id
product_id: int fk Product.id
amount: int
订单项目:
id: int pk ai
title: string
available: int
left: int
id: int pk ai
status: int
id: int pk ai
order_id: int fk Order.id
product_id: int fk Product.id
amount: int
因此,当购买产品时,将创建一个订单,其中包含一个或多个订单项。订单的状态指示订单是否已完成
我需要更新所有产品的“左”字段。对于具有特定状态(例如状态=2)的订单,应将订单项中的所有产品金额相加,然后从产品表中的“可用”值中减去结果,从而计算出该金额(也就是说,如果一个产品有10个可用订单,并且有一个完整的订单列出了该产品,且金额为3,则生成的left
应为7。)
理想情况下,我希望使用一个SQL查询来实现这一点。这非常简单。只需做一件事,从表Order\u项中获取金额的总和,其中Order table中的OrderId状态为=2(我假设这是完整状态的代码),您需要从可用值中减去该值。下面是对此的查询-
update Product p
set `left` = available - (select sum(amount)
from orderItem oi, `order` o
where oi.order_id = o.id
and product_id = p.id
and o.status = 2
)
这将根据您的需要更新您的产品表。在此处搜索“使用联接更新”,试一试,您将能够回答@Michael Toddw您使用的是哪种DBMS?Postgres?Oracle?今晚我将使用此解决方案。(我确实将您的答案编辑为保留SQL单词的反引号标识符。)