物料表 materials(y_name, y_quantity),產品表 pro_a(p_name, p_quantity)。需將產品用量彙總累加到物料表。
❌ 錯誤寫法 (標準 SQL 子查詢,MySQL 不支援): ```sql UPDATE materials m SET y_quantity = y_quantity + ( SELECT a.p_quantity FROM pro_a a WHERE a.p_name = m.y_name ) + ( SELECT b.p_quantity FROM pro_b b WHERE b.p_name = m.y_name );```
-- 單表關聯累加
UPDATE materials m
LEFT JOIN pro_a a ON m.y_name = a.p_name
SET m.y_quantity = m.y_quantity + a.p_quantity;
-- 多表關聯累加 (依次 JOIN)
UPDATE materials m
LEFT JOIN pro_a a ON m.y_name = a.p_name
LEFT JOIN pro_b b ON m.y_name = b.p_name
SET m.y_quantity = m.y_quantity + IFNULL(a.p_quantity,0) + IFNULL(b.p_quantity,0);
UPDATE table_a a
[INNER | LEFT | RIGHT] JOIN table_b b ON a.col = b.col
[INNER | LEFT | RIGHT] JOIN table_c c ON a.col = c.col
...
SET a.target_col = expression_involving(a.col, b.col, c.col...)
[WHERE condition];
IFNULL/COALESCE 處理SET 子句可引用任意參與 JOIN 的表的列WHERE 可進一步過濾更新範圍UPDATE ... FROM (SQL Server/PostgreSQL 語法)若產品表有多行同名,需先聚合再更新:
UPDATE materials m
LEFT JOIN (
SELECT p_name, SUM(p_quantity) AS total_qty FROM pro_a GROUP BY p_name
) a ON m.y_name = a.p_name
LEFT JOIN (
SELECT p_name, SUM(p_quantity) AS total_qty FROM pro_b GROUP BY p_name
) b ON m.y_name = b.p_name
SET m.y_quantity = m.y_quantity + IFNULL(a.total_qty,0) + IFNULL(b.total_qty,0);
y_name, p_name) 務必建索引LIMIT 或主鍵範圍),避免長事務鎖表SELECT 驗證 JOIN 結果:SELECT m.y_name, m.y_quantity, a.p_quantity, b.p_quantity FROM materials m LEFT JOIN ...