-- 目標表 A
tableA: billid (PK), bxmoney
-- 來源表 B
tableB: billid (FK), billmoney
-- 示例數據
tableA: (2001, NULL)
tableB: (2001, 100), (2001, 150), (2001, 300) -- 總和 550
UPDATE tableA
SET bxmoney = (
SELECT SUM(billmoney)
FROM tableB
WHERE tableB.billid = tableA.billid
GROUP BY tableB.billid
);
tableA 每行執行一次內層查詢,WHERE tableB.billid = tableA.billid 實現逐行匹配。SUM 需配合 GROUP BY billid,確保每個 billid 只返回一行匯總值。NULL,A 表 bxmoney 將被置為 NULL。若需保持原值或設 0,用 COALESCE:
SET bxmoney = COALESCE((SELECT SUM(billmoney) ...), 0);
-- 1. 確保 tableB.billid 有索引
CREATE INDEX idx_tableB_billid ON tableB(billid);
-- 2. 使用 JOIN 更新(MySQL/PostgreSQL/SQL Server 語法略異)
-- MySQL
UPDATE tableA a
JOIN (
SELECT billid, SUM(billmoney) AS total
FROM tableB
GROUP BY billid
) b ON a.billid = b.billid
SET a.bxmoney = b.total;
-- SQL Server
UPDATE a
SET bxmoney = b.total
FROM tableA a
JOIN (
SELECT billid, SUM(billmoney) AS total
FROM tableB
GROUP BY billid
) b ON a.billid = b.billid;
BEGIN; UPDATE ...; COMMIT;bxmoney,避免定時批量更新的延遲與鎖衝突。「子查詢聚合 + 相關條件」是跨表同步匯總值的標準模式,加上索引與 JOIN 改寫,輕松應對百萬級數據量。