Postgresql 中文操作指南

7.4. Combining Queries (UNION, INTERSECT, EXCEPT) #

可以使用集合运算并集、交集和差集来组合两个查询的结果。 语法如下:

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

这里 query1query2 是使用任何已在此点之前讨论过的特性的查询。

UNION 有效地将 query2 的结果追加到 query1 的结果(尽管无法保证这是行实际返回的顺序)。此外,除非使用 UNION ALL,否则会以与 DISTINCT 相同的方式从其结果中消除重复行。

INTERSECT 返回 query1query2 结果中同时存在的行。重复的行将被全部消除,但使用 INTERSECT ALL 除外。

EXCEPT 返回 query1 结果中但不在 query2 结果中的行。(两个查询之间有时候称为 difference。)同样,也消除了重复行,但使用 EXCEPT ALL 除外。

为计算两个查询的并集、交集或差集,两个查询必须“并集兼容”,这意味着它们返回相同数量的列,且相应列具有 Section 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)