根据标准 SQL UNION
/UNION ALL
不保证没有外部ORDER BY
子句的任何特定排序顺序 - 就像 SQL 中几乎没有任何地方不保证排序顺序一样ORDER BY
。
然而,Postgres 对 的普通情况使用“附加”步骤UNION ALL
,因此第一个分支的结果(即使在其分区中未排序)总是出现在下一个分支之前,等等。Postgres 只是按照给定的顺序附加每个分支的结果。这与以下LIMIT
条款特别相关:
SELECT 1 FROM tbl -- or any complex query
UNION ALL
SELECT 2
LIMIT 1
Run Code Online (Sandbox Code Playgroud)
显然这不适用于UNION
(without ALL
)。但除此之外,我从未见过 Postgres 无序返回,即上述查询中的“2”SELECT
,而第一个查询也会返回行。即使第一站的费用极其昂贵,也不会。
我过去曾对这种行为进行过查询。现在我遇到了一个说法, Postgres 可能会在这里返回无序的行,但没有实际证据证实。
当前的Postgres 手册对此事有这样的说法:
UNION
有效地将 的结果附加query2
到 的结果query1
(尽管不能保证这是实际返回行的顺序)。此外,它还从结果中消除重复行,其方式与DISTINCT
, except相同UNION ALL
。
这还不清楚。引用的顺序是否适用于子句列表SELECT
,或每个子句中的行,还是仅适用于返回的集合?另外,UNION ALL …