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

7.4.合并查询 (UNIONINTERSECTEXCEPT) #

可使用集合操作并集、交集和差集合并两个查询的结果。语法为

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

其中 查询 1查询 2 是可以使用到目前为止讨论过的任何要素的查询。

UNION查询 2 的结果有效地附加到 查询 1 的结果(但无法保证这是实际返回行的顺序)。此外,它从结果中消除了重复行,就像 DISTINCT 一样,除非使用 UNION ALL

INTERSECT 返回 查询 1查询 2 结果中同时存在的所有行。使用 INTERSECT ALL 之前将消除重复行。

EXCEPT 返回 查询 1 结果中存在但 查询 2 结果中不存在的所有行。(这有时称为两个查询之间的。)同样,在未使用 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)

还可以用括号包围单个 查询。如果 查询 需要使用后续部分中讨论的任何子句(如 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)