UNION 與 UNION ALL 都是將多個 SELECT 結果集垂直合併的集合運算子,但兩者在「重複資料處理」與「效能」上有本質差異。本文以實戰範例釐清觀念。
SELECT 的 欄位數量、順序、資料型別必須相容。ORDER BY 僅能放在最後一個 SELECT 之後,並參考第一個 SELECT 的欄位別名或序號。Store_Info(實體店銷售)與 Internet_Sales(網路銷售)皆含 Date、Sales 兩欄。
SELECT Date FROM Store_Info UNION SELECT Date FROM Internet_Sales;
結果:僅保留不重複的日期。資料庫內部會執行 DISTINCT 排序去重,資料量大時效能較差。
SELECT Date FROM Store_Info UNION ALL SELECT Date FROM Internet_Sales;
結果:直接合併兩張表的所有列,若同一天兩通路都有銷售,該日期會出現兩次。無排序去重動作,效能顯著優於 UNION。
SELECT Date, Sales FROM Store_Info UNION ALL SELECT Date, Sales FROM Internet_Sales;
同樣保留所有明細列,適合後續彙總分析(如 GROUP BY Date SUM(Sales))。
| 場景 | 建議運算子 | 理由 |
|---|---|---|
| 需唯一值清單(如下拉選單來源) | UNION | 自動去重 |
| ETL 階段合併分區表/日誌表 | UNION ALL | 避免昂貴排序,保留完整明細 |
| 後續仍要 GROUP BY 聚合 | UNION ALL | 重複列不影響聚合結果,省去去重成本 |
掌握 UNION 與 UNION ALL 的差異,能讓你在撰寫報表與 ETL SQL 時,兼顧正確性與執行效能。