在本教學中,您將學習如何使用Oracle UNION運算符來組合由兩個或多個查詢返回的結果集。
Oracle UNION運算符簡介
UNION運算符是一個集合運算符,它將兩個或多個SELECT語句的結果集組合到一個結果集中。
以下說明了組合兩個查詢的結果集的UNION運算符的語法:
SELECT
column_list_1
FROM
T1
UNION
SELECT
column_list_1
FROM
T2;
在此聲明中,column_list_1和column_list_2必須具有相同順序的相同列數。 另外,對應列的數據類型必須是相同的數據類型組,例如數字或字元。
SELECT
column_list
FROM
T1
UNION ALL
SELECT
column_list
FROM
T2;
Oracle UNION圖示
假設有兩個表 - T1和T2:
T1有三行:1,2和3T2也有三行:2,3和4
下圖說明瞭T1和T2表的UNION運算圖示:

UNION運算符刪除(消除)重複的行 - 2和3
下圖顯示了UNION ALL運算符T1和T2表的結果:

正如上面所看到的,UNION ALL保留了重複的行 - 2和3。
Oracle UNION示例
請參閱示例資料庫中的以下employees表和contacts表的ER圖結構。
Oracle UNION示例1
假設,需要發送電子郵件到員工和聯繫人表的電子郵件地址。 要做到這一點,首先,需要撰寫員工和聯繫人的電子郵件地址列表。然後發送電子郵件到列表中。
以下語句使用UNION運算符來構建員工和聯繫人表中的聯繫人列表:
SELECT
first_name,
last_name,
email,
'contact'
FROM
contacts
UNION SELECT
first_name,
last_name,
email,
'employee'
FROM
employees;
執行上面查詢語句,得到以下結果 -

2. Oracle UNION和ORDER BY示例
要對由UNION運算符返回的結果集進行排序,可以將ORDER BY子句添加到最後一個SELECT語句中,如下所示:
SELECT
first_name || ' ' || last_name name,
email,
'contact'
FROM
contacts
UNION SELECT
first_name || ' ' || last_name name,
email,
'employee'
FROM
employees
ORDER BY
name DESC;
在這個例子中,將first_name和last_name連接起來,並使用一個別名:name,結果按name列排序。
執行上面查詢代碼,得到以下結果 -

3. Oracle UNION ALL示例
以下語句返回員工和聯繫人的唯一姓氏(last_name):
SELECT
last_name
FROM
employees
UNION SELECT
last_name
FROM
contacts
ORDER BY
last_name;
該查詢返回了357個唯一的姓氏(last_name)值。參考下麵結果 -

但是,如果在查詢中使用UNION ALL而不是UNION,如下所示:
SELECT
last_name
FROM
employees
UNION ALL SELECT
last_name
FROM
contacts
ORDER BY
last_name;
該查詢返回426行。 另外,一些行是重複的,例如,Atkinson, Barnett。 這是因為UNION ALL操作符不會刪除重複的行。

Oracle UNION 與 JOIN 區別
UNION將結果集放置在另一個上面,這意味著它將垂直地附加結果集。但是,諸如INNER JOIN或LEFT JOIN的連接將結果集水準組合。
下圖說明瞭union和join的區別:

在本教學中,您已經學習了如何使用Oracle UNION運算符來組合多個查詢的結果集。
