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

MSSQL 多表/結果集合併完全指南:UNION、EXCEPT、INTERSECT、UNION CORRESPONDING 語法、規則與優化實戰

     編輯:關於SqlServer

核心集合運算符對比

運算符語義去重兼容性要求典型場景
UNION聯集 (A ∪ B)是 (DISTINCT)列數、順序、類型兼容多源數據匯總、分區表合併
UNION ALL聯集含重複否同上高性能合併、日志聚合、已知無重複
EXCEPT差集 (A - B)是同上找出 A 有 B 無(如未完成訂單)
INTERSECT交集 (A ∩ B)是同上共同客戶、合規核對

UNION / UNION ALL 核心規則(必讀)

  1. 列數、順序、類型兼容:對應位置類型需隱式轉換或顯式 CAST(如 MONEY 與 INT 兼容,DATETIME 與 BINARY 不兼容)。
  2. 列名以第一個查詢為準:結果集元數據來源於首個 SELECT。
  3. ORDER BY / COMPUTE 只能放末尾:作用於最終結果集,不可放在各分支查詢中(需用子查詢/包裹視圖繞過)。
  4. INTO 僅允許最終結果集:SELECT ... INTO #Tmp FROM A UNION ALL SELECT ... FROM B 正確;分支中用 INTO 報錯。
  5. GROUP BY / HAVING 僅限分支內部:不影響最終合併邏輯。
  6. 可用於 INSERT:INSERT INTO Target SELECT ... FROM A UNION ALL SELECT ... FROM B。
  7. FOR BROWSE 不兼容:游標瀏覽模式禁用。

排序最佳實踐

-- 錯誤:分支各自排序無效
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;

EXCEPT / INTERSECT 實戰模式

EXCEPT:差集查詢(Oracle 對應 MINUS)

-- 找出未完成必修課的學生
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。

INTERSECT:交集查詢

SELECT CustomerID FROM OnlineCustomers
INTERSECT
SELECT CustomerID FROM StoreCustomers;
-- 僅返回兩渠道皆存在的客戶

UNION CORRESPONDING(非標準/部分 DB 支持)

按**列名匹配**而非位置合併,自動忽略無共同列。示例:

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,除非業務要求去重(去重需排序/哈希,開銷大)。
  • 分支查詢各自加強過濾(WHERE)、投影最小列,減少合併數據量。
  • 大數據集合併考慮分區表、索引視圖、或應用層分頁合併。
  • 避免在 UNION 分支中使用非 SARGable 條件(函數包裹列),導致掃描。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved