在本教學中,將學習如何使用SQL Server UNION將兩個或多個查詢的結果合併到一個結果集中。
SQL Server UNION簡介
SQL Server UNION是一組集合操作,用於將兩個SELECT語句的結果組合到一個結果集中,該結果集包括屬於union中SELECT語句的所有行。
以下是SQL Server UNION的語法:
query_1
UNION
query_2
以下是上述語法中的查詢要求:
- 兩個查詢中列的數量和順序必須相同。
- 相應列的數據類型必須相同或相容。
下麵圖中說明了T1表的結果集如何與T2表的結果集聯合:

UNION 與 UNION ALL
默認情況下,UNION運算符從結果集中刪除所有重複的行。 但是,如果要保留重複的行,則需要明確指定ALL關鍵字,如下所示:
query_1
UNION ALL
query_2
換句話說,UNION運算符刪除重複行,而UNION ALL運算符在最終結果集中包含重複行。
UNION 與 JOIN
INNER JOIN或LEFT JOIN等連接組合了兩個表中的列,而UNION組合了兩個查詢中的行。
換句話說,join會水準附加結果集,而union會垂直附加結果集。
下圖說明瞭UNION和JOIN之間的主要區別:
SQL Server UNION示例
請參閱示例資料庫中的staff和customers表,它們的結構和關係如下所示:

1. UNION和UNION ALL示例
以下示例將員工和客戶的名稱合併到一個列表中:
SELECT
first_name,
last_name
FROM
sales.staffs
UNION
SELECT
first_name,
last_name
FROM
sales.customers;
執行上面查詢語句,得到以下結果:
如上圖中,它返回了1454行。
staffs表有10行,customers表有1445行,如以下查詢說明所示:
SELECT
COUNT (*)
FROM
sales.staffs;
-- 10
SELECT
COUNT (*)
FROM
sales.customers;
-- 1454
因為union的結果集只返回1454行,這意味著刪除了一個重複行。要包含重複行,請使用UNION ALL,如以下查詢中所示:
SELECT
first_name,
last_name
FROM
sales.staffs
UNION ALL
SELECT
first_name,
last_name
FROM
sales.customers;
執行上面查詢語句,得到以下結果:
查詢按預期返回1455行。
2. UNION和ORDER BY示例
要對UNION運算符返回的結果集進行排序,請將ORDER BY子句放在最後一個查詢中,如下所示:
SELECT
select_list
FROM
table_1
UNION
SELECT
select_list
FROM
table_2
ORDER BY
order_list;
例如,要對客戶和員工的名字(first_name)和姓氏(last_name)進行排序,請使用以下查詢語句:
SELECT
first_name,
last_name
FROM
sales.staffs
UNION ALL
SELECT
first_name,
last_name
FROM
sales.customers
ORDER BY
first_name,
last_name;
執行上面查詢語句,得到以下結果:

