首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

SQL 跨表聚合更新:將 B 表 billmoney 求和同步至 A 表 bxmoney

     編輯:程式設計疑難解答

場景與數據結構

-- 目標表 A
tableA: billid (PK), bxmoney

-- 來源表 B
tableB: billid (FK), billmoney

-- 示例數據
tableA: (2001, NULL)
tableB: (2001, 100), (2001, 150), (2001, 300)  -- 總和 550

標準 UPDATE + 子查詢寫法

UPDATE tableA
SET bxmoney = (
    SELECT SUM(billmoney)
    FROM tableB
    WHERE tableB.billid = tableA.billid
    GROUP BY tableB.billid
);

關鍵點解析

  1. 相關子查詢:外層 tableA 每行執行一次內層查詢,WHERE tableB.billid = tableA.billid 實現逐行匹配。
  2. GROUP BY 必須:聚合函數 SUM 需配合 GROUP BY billid,確保每個 billid 只返回一行匯總值。
  3. 無匹配行處理:若 B 表無對應 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;
  • 若 B 表頻繁變動,考慮觸發器或物化視圖實時維護 bxmoney,避免定時批量更新的延遲與鎖衝突。

「子查詢聚合 + 相關條件」是跨表同步匯總值的標準模式,加上索引與 JOIN 改寫,輕松應對百萬級數據量。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved