支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

7.4. 合併查詢 (UNIONINTERSECTEXCEPT) #

兩個查詢的結果可以使用集合運算 union、intersection 和 difference 來合併。語法是

query1 UNION [ALL] query2
query1 INTERSECT [ALL] query2
query1 EXCEPT [ALL] query2

其中 query1query2 是可以使用到目前為止討論的任何功能的查詢。

UNION 實際上將 query2 的結果附加到 query1 的結果(雖然不保證這是實際傳回資料列的順序)。此外,它會從結果中刪除重複的資料列,就像 DISTINCT 一樣,除非使用 UNION ALL

INTERSECT 會傳回同時存在於 query1 的結果和 query2 的結果中的所有資料列。除非使用 INTERSECT ALL,否則會刪除重複的資料列。

EXCEPT 會傳回存在於 query1 的結果中但不存在於 query2 的結果中的所有資料列。(這有時稱為兩個查詢之間的差集。)同樣,除非使用 EXCEPT ALL,否則會刪除重複項。

為了計算兩個查詢的 union、intersection 或 difference,這兩個查詢必須是union 相容,這表示它們傳回相同數量的欄位,並且對應的欄位具有相容的資料類型,如第 10.5 節所述。

集合運算可以組合,例如

query1 UNION query2 EXCEPT query3

這相當於

(query1 UNION query2) EXCEPT query3

如此處所示,您可以使用括號來控制評估順序。如果沒有括號,UNIONEXCEPT 會從左到右結合,但 INTERSECT 的結合性比這兩個運算子更強。因此

query1 UNION query2 INTERSECT query3

表示

query1 UNION (query2 INTERSECT query3)

您也可以用括號括住個別的 query。如果 query 需要使用以下各節中討論的任何子句,例如 LIMIT,這很重要。如果沒有括號,您會收到語法錯誤,否則該子句將被理解為應用於集合運算的輸出,而不是其輸入之一。例如,

SELECT a FROM b UNION SELECT x FROM y LIMIT 10

可接受,但表示

(SELECT a FROM b UNION SELECT x FROM y) LIMIT 10

不是

SELECT a FROM b UNION (SELECT x FROM y LIMIT 10)

提交更正

如果您在文件中發現任何不正確、與特定功能的經驗不符或需要進一步澄清的地方,請使用此表單來回報文件問題。