在 SQL Server 2000 中,UNION 運算子用於將兩個或多個查詢的結果集合併為單一結果集,並自動移除重複的行。而 UNION ALL 則保留所有行,包括重複項目。兩者的基本使用規則相同:所有查詢的欄位數量、順序必須一致,且資料型別需相容。
某企業為分析關鍵零件生產進度,建立 Key_Item_Cal 表,並設計三層查詢:明細資料、一級彙總、二級彙總。透過 UNION 合併這三個查詢時,發現明細資料與二級彙總數值不符,但彙總值本身是正確的。
SELECT ... 明細查詢
UNION
(
SELECT ... 一級彙總
UNION
SELECT ... 二級彙總
)
ORDER BY Style ASC
執行結果顯示,部分機架(如 GR180.14.2.1、PY165G.14.2.1B、PY165K.14.2.1)的明細筆數與彙總值明顯不符。原因在於 UNION 會執行去重複操作,若明細資料中存在與彙總行完全相同的列值,這些明細行會被誤判為重複而被移除,導致結果集行數減少、統計失真。
SELECT ... 明細查詢
UNION ALL
(
SELECT ... 一級彙總
UNION
SELECT ... 二級彙總
)
ORDER BY Style ASC
改用 UNION ALL 後,所有明細行完整保留,彙總值與明細筆數完全吻合,問題解決。
| 特性 | UNION | UNION ALL |
|---|---|---|
| 重複行處理 | 自動去重(需排序比較) | 保留所有行 |
| 效能 | 較慢(需額外排序與比較) | 較快(直接合併) |
| 適用場景 | 需確保結果唯一性時 | 需保留所有資料行、或確知無重複時 |
UNION ALL,再由應用層去重。本文透過實際案例展示 UNION 去重特性導致的統計偏差,強調在報表類多結果集合併場景下,UNION ALL 往往是更安全、高效的選擇。