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

SQL Server 集合運算完整指南:UNION、UNION ALL、EXCEPT、INTERSECT 與 Venn 圖對照

     編輯:SQL Server 2005

四大集合運算子對照表

運算子數學意義Venn 圖重複列處理典型用途
UNION並集 (A ∪ B)兩圓合併區域**去重**合併不同來源同結構資料
UNION ALL多重集合併兩圓疊加**保留所有**高效能合併、已知無重複
EXCEPT差集 (A \ B)A 圓扣除重疊去重後比較找出僅存在於 A 的列
INTERSECT交集 (A ∩ B)重疊區域去重後比較找出共同存在的列

完整可執行範例

USE tempdb;
GO

IF OBJECT_ID('t1') IS NOT NULL DROP TABLE t1;
IF OBJECT_ID('t2') IS NOT NULL DROP TABLE t2;
GO

CREATE TABLE t1 (a INT);
INSERT t1 VALUES (1),(2),(3);

CREATE TABLE t2 (a INT);
INSERT t2 VALUES (3),(4),(5);
GO

-- 1. UNION:並集且去重
SELECT * FROM t1 UNION SELECT * FROM t2;
-- 結果: 1,2,3,4,5

-- 2. UNION ALL:並集保留重複
SELECT * FROM t1 UNION ALL SELECT * FROM t2;
-- 結果: 1,2,3,3,4,5

-- 3. EXCEPT:t1 有、t2 沒有
SELECT * FROM t1 EXCEPT SELECT * FROM t2;
-- 結果: 1,2

-- 4. INTERSECT:兩邊都有
SELECT * FROM t1 INTERSECT SELECT * FROM t2;
-- 結果: 3

進階應用技巧

1. 多欄位比對(隱含比較所有 SELECT 列)

SELECT col1, col2 FROM TableA
EXCEPT
SELECT col1, col2 FROM TableB;

2. 模擬 FULL OUTER JOIN 去重

SELECT * FROM A UNION SELECT * FROM B
-- 等同於
SELECT * FROM A FULL JOIN B ON A.pk = B.pk
WHERE A.pk IS NULL OR B.pk IS NULL
-- 但 UNION 更簡潔且自動去重

3. 找出差異列(資料比對/同步驗證)

-- 僅在 Source 不在 Target
SELECT * FROM Source EXCEPT SELECT * FROM Target;

-- 僅在 Target 不在 Source
SELECT * FROM Target EXCEPT SELECT * FROM Source;

-- 對稱差集(兩邊獨有)
(SELECT * FROM Source EXCEPT SELECT * FROM Target)
UNION ALL
(SELECT * FROM Target EXCEPT SELECT * FROM Source);

4. 效能優化建議

  • UNION ALL 優於 UNION:無 Sort Distinct 成本,若業務確定無重複或可容忍重複,**永遠用 ALL**。
  • 加上 ORDER BY 只能放在最後一個 SELECT 之後,且需搭配 TOP 100 PERCENT(舊版)或直接放最外層。
  • 資料型別必須相容:對應位置欄位型別需隱含轉換或顯式 CAST。
  • 大量資料:確保參與比較欄位有索引,或先匯入暫存表建索引再做集合運算。

總結

集合運算子是 T-SQL 聲明式表達資料關係的利器:**UNION/ALL 合併、EXCEPT 找差異、INTERSECT 找共同**。善用 UNION ALL 避免不必要的排序去重,能大幅提升 ETL/同步/比對作業效能。

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