網頁

2019/12/4

Oracle UNION 與 UNION ALL 差別

UNIONUNION ALL的差別在於,
UNION會聯集兩個查詢結果並將相同的資料合併為一筆;
UNION ALL也是聯集兩個查詢結果,但相同的資料不合併為一筆。


例如現在有兩張資料表EMPLOYEEMANAGER如下。

EMPLOYEE

+----+------+------------+---------+
| ID | NAME |   PHONE    | ADDRESS |
+----+------+------------+---------+
|  1 | John | 0931123456 | Taipei  |
|  2 | Mary | 0932000811 | Hualian |
|  3 | Nico | 0933111224 | Yilan   |
+----+------+------------+---------+

MANAGER

+----+------+------------+-------------------+
| ID | NAME |   PHONE    |       TITLE       |
+----+------+------------+-------------------+
|  1 | Dave | 0931300699 | Marketing Manager |
|  2 | Mike | 0928811566 | HR Manager        |
|  3 | John | 0934274998 | Project Manager   |
+----+------+------------+-------------------+

例如下面使用UNION查詢兩資料表都有的NAME欄位,可以看到在兩張表NAME欄位中所有的姓名都被列出,不過相同的名稱John被合併為一筆。

SELECT e.NAME FROM EMPLOYEE e 
UNION
SELECT m.NAME FROM MANAGER m;
+------+
| NAME |
+------+
| Dave |
| John | <-- combine
| Mary |
| Mike |
| Nico |
+------+

下面一樣查詢兩張表的NAME欄位,但改用UNION ALL結合兩個查詢結果,可以看到內容相同的John沒有被合併為一。

SELECT e.NAME FROM EMPLOYEE e 
UNION ALL
SELECT m.NAME FROM MANAGER m;
+------+
| NAME |
+------+
| John | <--
| Mary |
| Nico |
| Dave |
| Mike |
| John | <--
+------+

要強調的是所謂"資料相同"指UNION查詢結果中整列所有欄位的資料都相同才會被合併,只要某一欄資料不同則兩筆資料是不同的所以不會被合併。

例如下面使用UNION查詢上面兩資料表的IDNAMEPHONE欄位,但這時John並沒有和上面一樣因為名稱相同被合併為同一筆資料,因為以全部的欄位資料來看IDPHONE欄位資料並不相同,兩筆資料是不同的。

SELECT e.ID, e.NAME, e.PHONE FROM EMPLOYEE e 
UNION
SELECT m.ID, m.NAME, m.PHONE FROM MANAGER m;
+----+------+------------+
| ID | NAME |   PHONE    |
+----+------+------------+
|  1 | Dave | 0931300699 |
|  1 | John | 0931123456 | <--
|  2 | Mary | 0932000811 |
|  2 | Mike | 0928811566 |
|  3 | John | 0934274998 | <--
|  3 | Nico | 0933111224 |
+----+------+------------+

參考:

沒有留言:

張貼留言