| 運算符 | 語義 | 去重 | 兼容性要求 | 典型場景 |
|---|---|---|---|---|
| UNION | 聯集 (A ∪ B) | 是 (DISTINCT) | 列數、順序、類型兼容 | 多源數據匯總、分區表合併 |
| UNION ALL | 聯集含重複 | 否 | 同上 | 高性能合併、日志聚合、已知無重複 |
| EXCEPT | 差集 (A - B) | 是 | 同上 | 找出 A 有 B 無(如未完成訂單) |
| INTERSECT | 交集 (A ∩ B) | 是 | 同上 | 共同客戶、合規核對 |
MONEY 與 INT 兼容,DATETIME 與 BINARY 不兼容)。SELECT ... INTO #Tmp FROM A UNION ALL SELECT ... FROM B 正確;分支中用 INTO 報錯。INSERT INTO Target SELECT ... FROM A UNION ALL SELECT ... FROM B。-- 錯誤:分支各自排序無效
SELECT AID FROM A ORDER BY AID UNION ALL SELECT BID FROM B ORDER BY BID;
-- 正確 1:外層包裹排序
SELECT * FROM (SELECT AID FROM A UNION ALL SELECT BID FROM B) T ORDER BY AID;
-- 正確 2:直接末尾排序(列名取自第一分支)
SELECT AID FROM A UNION ALL SELECT BID FROM B ORDER BY AID;
-- 正確 3:使用位置序數(跨 DBMS 兼容)
SELECT AID FROM A UNION ALL SELECT BID FROM B ORDER BY 1;
-- 找出未完成必修課的學生
SELECT StudentID, Name FROM Students
EXCEPT
SELECT StudentID, Name FROM CompletedCourses;
-- 自動去重,若需保留重複需用 NOT EXISTS/LEFT JOIN
注意:SQL Server 2000 不支持 EXCEPT/INTERSECT(2005+ 引入),舊版本改用 LEFT JOIN ... WHERE B.key IS NULL 或 NOT EXISTS。
SELECT CustomerID FROM OnlineCustomers
INTERSECT
SELECT CustomerID FROM StoreCustomers;
-- 僅返回兩渠道皆存在的客戶
按**列名匹配**而非位置合併,自動忽略無共同列。示例:
CREATE TABLE A (ID INT, Office INT, Address VARCHAR(20), Dept CHAR(5), Pay MONEY);
CREATE TABLE B (Office INT, ID INT, Address VARCHAR(20), Dept CHAR(5));
SELECT * FROM A UNION CORRESPONDING SELECT * FROM B;
-- 結果僅含 ID, Office, Address, Dept 四共同列
警告:SQL Server **不支持**此語法,僅作為概念了解。標準 SQL:2011 包含 CORRESPONDING 子句,但主流商業庫多未實現。
UNION ALL,除非業務要求去重(去重需排序/哈希,開銷大)。