首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server UNION 與 UNION ALL 差異、效能與 Access 相容性替代方案

     編輯:關於SqlServer

核心差異

特性UNIONUNION ALL
重複列移除 (DISTINCT)保留所有
效能需排序/雜湊去重,較慢單純串流,極快
語意數學聯集多重集聯集

基本用法


-- 銷售與採購的供應商產品清單 (去重)
SELECT prod_id, sup_id FROM sale_item WHERE order_no=10001
UNION
SELECT prod_id, sup_id FROM purchase WHERE pur_no=50001
ORDER BY 1,2;

-- 保留重複 (如需統計出現次數)
SELECT prod_id, sup_id FROM sale_item WHERE order_no=10001
UNION ALL
SELECT prod_id, sup_id FROM purchase WHERE pur_no=50001
ORDER BY 1,2;

Access 相容性:CASE 無支援時用 UNION ALL 模擬條件邏輯

Access SQL 不支援 CASE,僅有 IIF。複雜條件可拆分為互斥查詢再 UNION ALL:


-- 原邏輯:若 b.bdl>0 則 a.ydl+b.rmpwr-b.bdl ELSE a.yd-b.yd
-- 拆分為兩個互斥查詢
SELECT a.ydl + b.rmpwr - b.bdl AS yd
FROM a, b WHERE a.mid=b.mid AND b.bdl > 0
UNION ALL
SELECT a.yd - b.yd
FROM a, b WHERE a.mid=b.mid AND ISNULL(b.bdl,-1) <= 0;
  • 兩查詢 WHERE 條件互斥且窮盡,結果無重複,UNION ALL 正確且高效
  • 若條件非互斥,必須用 UNION 去重

效能提示

  • 大量資料 **優先用 UNION ALL**,應用層或報表層處理去重
  • ORDER BY 僅能放在最後一個查詢之後,排序欄位用序數 (1,2) 或第一個查詢別名
  • 所有查詢欄位數、型別必須相容 (隱含轉換遵循優先順序)

UNION/UNION ALL 是集合運算基石,理解「去重代價」與「互斥條件拆分」技巧,能在舊版 Access、跨平台遷移、複雜報表邏輯中遊刃有餘。

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