SQL 更新 table 从另一个中选择
SQL updating a table selecting from another
为了简化一点,我有一个 product
table:
PRODUCT
---
id
type (FK)
和对应的1:1type
table(product.type -> type.id
):
TYPE
---
id
weight
那我有一个packaging
table.
PACKAGING
---
id
total_weight
一个包装可以包含一种或多种产品。 packaging.total_weight
是一个方便的字段,存储它包含的所有产品重量的总和。
n*m packaging*products
关系由nm_packaging_product
table:
实现
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;
这也将解决同一产品在包裹中多次出现的问题。
为了简化一点,我有一个 product
table:
PRODUCT
---
id
type (FK)
和对应的1:1type
table(product.type -> type.id
):
TYPE
---
id
weight
那我有一个packaging
table.
PACKAGING
---
id
total_weight
一个包装可以包含一种或多种产品。 packaging.total_weight
是一个方便的字段,存储它包含的所有产品重量的总和。
n*m packaging*products
关系由nm_packaging_product
table:
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;
这也将解决同一产品在包裹中多次出现的问题。