Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16

7.4. 合并查询(UNIONINTERSECTEXCEPT#

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

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,否则会消除重复项。

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