2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 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. 合併查詢 (UNION, INTERSECT, EXCEPT) #

可以使用集合操作 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)

提交更正

如果您在文件中發現任何不正確、不符合您對特定功能的體驗或需要進一步闡明的內容,請使用此表格報告文件問題。