Postgresql 中文操作指南
7.4. Combining Queries (UNION, INTERSECT, EXCEPT) #
可以使用集合运算并集、交集和差集来组合两个查询的结果。 语法如下:
query1 UNION [ALL] query2
query1 INTERSECT [ALL] query2
query1 EXCEPT [ALL] query2
这里 query1 和 query2 是使用任何已在此点之前讨论过的特性的查询。
UNION 有效地将 query2 的结果追加到 query1 的结果(尽管无法保证这是行实际返回的顺序)。此外,除非使用 UNION ALL,否则会以与 DISTINCT 相同的方式从其结果中消除重复行。
INTERSECT 返回 query1 和 query2 结果中同时存在的行。重复的行将被全部消除,但使用 INTERSECT ALL 除外。
EXCEPT 返回 query1 结果中但不在 query2 结果中的行。(两个查询之间有时候称为 difference。)同样,也消除了重复行,但使用 EXCEPT ALL 除外。
为计算两个查询的并集、交集或差集,两个查询必须“并集兼容”,这意味着它们返回相同数量的列,且相应列具有 Section 10.5 中描述的兼容数据类型。
集合运算可以组合起来,例如:
query1 UNION query2 EXCEPT query3
等效于
(query1 UNION query2) EXCEPT query3
如这里所示,你可以使用括号来控制运算顺序。如果不用括号,UNION 和 EXCEPT 将从左到右关联,但 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)