| 運算子 | 數學意義 | 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
SELECT col1, col2 FROM TableA
EXCEPT
SELECT col1, col2 FROM TableB;
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 更簡潔且自動去重
-- 僅在 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);
集合運算子是 T-SQL 聲明式表達資料關係的利器:**UNION/ALL 合併、EXCEPT 找差異、INTERSECT 找共同**。善用 UNION ALL 避免不必要的排序去重,能大幅提升 ETL/同步/比對作業效能。