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单词的反引号标识符。)