SQL 更新 table 从另一个中选择

SQL updating a table selecting from another

为了简化一点,我有一个 product table:

PRODUCT
---
id
type (FK)

和对应的1:1typetable(product.type -> type.id):

TYPE
---
id
weight

那我有一个packagingtable.

PACKAGING
---
id
total_weight

一个包装可以包含一种或多种产品。 packaging.total_weight 是一个方便的字段,存储它包含的所有产品重量的总和。

n*m packaging*products关系由nm_packaging_producttable:

实现
NM_PACKAGING_PRODUCT
---
packaging_id (PK, FK)
product_id (PK, FK)

现在,有人可以改变产品的重量。发生这种情况时,我想更新 packaging.total_weight 计算新权重。我只知道权重发生变化的@product_id

我想 UPDATE 单曲 SQL。喜欢:

UPDATE
    PACKAGING
SET
    total_weight=???
WHERE
    id IN (SELECT packaging_id FROM NM_PACKAGING_PRODUCT WHERE product_id = @prodotto_id)

如何?

试试这个

UPDATE
    PACKAGING
SET
    total_weight= (select sum(weight) from TYPE,NM_PACKAGING_PRODUCT, PRODUCT
                   where type.id = product.type and product.id= nm_product.product_id and 
                   nm_packaging_product.packaging_id = packaging.id  )
WHERE
    id IN (SELECT packaging_id FROM NM_PACKAGING_PRODUCT WHERE product_id = @prodotto_id)

重新计算所有权重并仅重置发生变化的权重:

UPDATE PACKAGING p JOIN
       (SELECT packaging_id, SUM(weight) as total_weight
        FROM NM_PACKAGING_PRODUCT pp
        GROUP BY packing_id
       ) ppw
       ON p.packaging_id = ppw.packaging_id    
    SET total_weight = ppw.total_weight
    where p.total_weight <> ppw.total_weight;

这也将解决同一产品在包裹中多次出现的问题。