SELECT m.id, m.name, m.quantity,
(SELECT SUM(c.quantity) FROM ctable c WHERE c.mid = m.id) AS ssum,
(m.quantity - (SELECT SUM(c.quantity) FROM ctable c WHERE c.mid = m.id)) AS jian
FROM mtable m
同一子查詢執行兩次,隨資料量增長效能急劇下降。
WITH c AS (
SELECT mid, SUM(quantity) AS total_qty
FROM ctable
GROUP BY mid
)
SELECT m.id, m.name, m.quantity,
ISNULL(c.total_qty, 0) AS ssum,
m.quantity - ISNULL(c.total_qty, 0) AS jian
FROM mtable m
LEFT JOIN c ON m.id = c.mid;
SELECT m.id, m.name, m.quantity,
ISNULL(c.total_qty, 0) AS ssum,
m.quantity - ISNULL(c.total_qty, 0) AS jian
FROM mtable m
LEFT JOIN (
SELECT mid, SUM(quantity) AS total_qty
FROM ctable
GROUP BY mid
) c ON m.id = c.mid;
-- 暫存表(跨 Session 可見,支援索引)
CREATE TABLE #tmp_sum (mid INT PRIMARY KEY, total_qty INT);
INSERT INTO #tmp_sum
SELECT mid, SUM(quantity) FROM ctable GROUP BY mid;
SELECT m.id, m.name, m.quantity,
ISNULL(t.total_qty, 0) AS ssum,
m.quantity - ISNULL(t.total_qty, 0) AS jian
FROM mtable m
LEFT JOIN #tmp_sum t ON m.id = t.mid;
DROP TABLE #tmp_sum;
SELECT m.id, m.name, m.quantity,
c.total_qty AS ssum,
m.quantity - c.total_qty AS jian
FROM mtable m
OUTER APPLY (
SELECT SUM(quantity) AS total_qty
FROM ctable c WHERE c.mid = m.id
) c;
| 方案 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
| CTE | 中小資料、邏輯複雜 | 可讀性強、可遞迴 | 極大資料可能記憶體壓力 |
| 派生表 | 通用、舊版 DB | 相容性好 | 嵌套多層難維護 |
| 暫存表 | 大數據、多次重用 | 可索引、統計資訊 | TempDB 開銷、需手動清理 |
| APPLY | SQL Server、逐列計算 | 語意精確 | 跨平台不支援 |