

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 設定運算子
<a name="UNION"></a>

*集合運算子*用於比較和合併兩個個別查詢表達式的結果。

AWS Clean Rooms Spark SQL 支援下表所列的下列一組運算子。


| 設定運算子  | 
| --- | 
| INTERSECT | 
| INTERSECT ALL | 
| EXCEPT | 
| 全部除外 | 
| UNION | 
| UNION ALL | 

例如，如果您想知道哪些網站使用者同時是買方和賣家，但其使用者名稱儲存在不同的資料欄或資料表中，您可以找出這兩種類型使用者的*交集*。如果您想知道哪些網站使用者是買方，但不是賣家，您可以使用 EXCEPT 運算子找出兩份使用者清單之間的*差異*。如果您想要建構所有使用者的清單，但不考慮角色，您可以使用 UNION 運算子。

**注意**  
ORDER BY、LIMIT、SELECT TOP 和 OFFSET 子句不能用於 UNION、UNION ALL、INTERSECT 和 EXCEPT 集運算子合併的查詢表達式。

**Topics**
+ [語法](#UNION-synopsis)
+ [Parameters](#UNION-parameters)
+ [集合運算子的評估順序](#UNION-order-of-evaluation-for-set-operators)
+ [使用須知](#UNION-usage-notes)
+ [範例 UNION 查詢](example_union_query.md)
+ [範例 UNION ALL 查詢](example_unionall_query.md)
+ [範例 INTERSECT 查詢](example_intersect_query.md)
+ [範例 EXCEPT 查詢](Example_EXCEPT_query.md)

## 語法
<a name="UNION-synopsis"></a>

```
subquery1
{ { UNION [ ALL | DISTINCT ] |
              INTERSECT [ ALL | DISTINCT ] |
              EXCEPT [ ALL | DISTINCT ] } subquery2 } [...] }
```

## Parameters
<a name="UNION-parameters"></a>

 *subquery1、subquery2*   
查詢表達式，以其選取清單的形式對應至 UNION、UNION ALL、INTERSECT、INTERSECT ALL、EXCEPT 或 EXCEPT ALL 運算子後面的第二個查詢表達式。兩個表達式必須包含採用相容資料類型的相同輸出資料欄數，否則就無法比較和合併這兩個結果集。設定操作不允許在不同資料類型類別之間進行隱含轉換。如需詳細資訊，請參閱[類型相容性與轉換](s_Type_conversion.md)。  
您可以建構包含無限查詢表達式數目的查詢，並將它們與 UNION、INTERSECT 和 EXCEPT 運算子的任意組合連結。例如，假設資料表 T1、T2 和 T3 包含相容的資料欄集，則以下查詢結構有效：  

```
select * from t1
union
select * from t2
except
select * from t3
```

UNION 【全部 \| DISTINCT】  
此集合操作會從兩個查詢表達式傳回資料列，無論資料列衍生自其中一個或兩個表達式。

交集 【全部 \| 不同】  
此集合操作會傳回衍生自兩個查詢表達式的資料列。未由兩個表達式傳回的資料列則會遭到捨棄。

EXCEPT 【全部 \| DISTINCT】  
此集合操作會傳回衍生自兩個查詢表達式之一的資料列。若要限定結果，資料列必須存在第一個結果資料表中，但不能存在第二個資料表中。  
EXCEPT ALL 不會從結果列中移除重複項目。  
MINUS 和 EXCEPT 是一模一樣的同義詞。

## 集合運算子的評估順序
<a name="UNION-order-of-evaluation-for-set-operators"></a>

UNION 和 EXCEPT 集合運算子為左關聯。若未指定括號來影響優先順序，則會從左到右評估這些集合運算子的組合。例如，在下列查詢中，T1 和 T2 的 UNION 會先評估，然後在 UNION 結果上執行 EXCEPT 操作：

```
select * from t1
union
select * from t2
except
select * from t3
```

在相同查詢中使用運算子組合時，INTERSECT 運算子的優先順序高於 UNION 和 EXCEPT 運算子。例如，下列查詢會先評估 T2 和 T3 的交集，再將結果與 T1 進行聯集：

```
select * from t1
union
select * from t2
intersect
select * from t3
```

加入括號就可以強制執行不同的評估順序。在下列案例中，T1 和 T2 的聯集結果會與 T3 交集，而查詢可能會產生不同的結果。

```
(select * from t1
union
select * from t2)
intersect
(select * from t3)
```

## 使用須知
<a name="UNION-usage-notes"></a>
+ 集合操作查詢的結果中傳回的資料欄名稱，是來自第一個查詢表達式的資料表中的資料欄名稱 (或別名)。這些資料欄名稱可能會造成誤導，因為資料欄中的值是從任一邊集合運算子的資料表衍生，所以建議您為結果集提供有意義的別名。
+ 當集合運算子查詢傳回小數結果時，對應的結果資料欄就會提升，以傳回相同的精確度和小數位數。例如，在以下查詢中，T1.REVENUE 是 DECIMAL(10,2) 資料欄，而 T2.REVENUE 是 DECIMAL(8,4) 資料欄，小數結果會提升為 DECIMAL(12,4)：

  ```
  select t1.revenue union select t2.revenue;
  ```

  小數位數為 `4`，因為這是兩個資料欄的小數位數上限。精確度為 `12`，因為 T1.REVENUE 要求小數點左邊有 8 位數 (12 - 4 = 8)。此類型提升可確保 UNION 兩邊的所有值都能納入結果中。若是 64 位元值，最高結果精確度為 19，而結果小數位數上限為 18。若是 128 位元值，最高結果精確度為 38，而結果小數位數上限為 37。

  如果產生的資料類型超過 AWS Clean Rooms 精確度和比例限制，查詢會傳回錯誤。
+ 在集合操作中，若每個對應資料欄配對的這兩個資料值為*等於*或*兩者皆為 NULL*，則這兩個資料列會視為相同。例如，若資料表 T1 和 T2 都包含一個資料欄和一個資料列，而該資料列在兩個資料表中都是 NULL，則對這些資料表執行 INTERSECT 操作就會傳回該資料列。