根据标准 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
显然,这不适用于UNION
(没有ALL
)。但除此之外,我从未见过 Postgres 乱序返回,即上述查询中的“2”SELECT
,而第一个也会返回行。即使第一站非常昂贵,也不是。
我过去曾基于此行为的查询。现在我遇到了一个说法,Postgres 可能会在这里返回乱序的行,但没有得到实际证据的证实。
当前的Postgres 手册对此事有这样的说法:
UNION
有效地将结果附加到query2
结果query1
(尽管不能保证这是实际返回行的顺序)。此外,它从结果中消除重复行,与使用 , 的方式DISTINCT
相同UNION ALL
。
这很不清楚。引用的顺序是否适用于SELECT
子句列表,或每个子句中的行,还是仅适用于返回的集合?此外,UNION ALL
仅在第二句中提及,因此尚不清楚最重要的第一句是否应该适用于UNION ALL
...
任何人都可以举一个例子,其中行被乱序返回,破坏了UNION ALL
子句的顺序?在任何版本的 Postgres 中。(即使最新版本最有趣。)
如果不是这样,是否有理由相信这可能会在未来的版本中发生变化?
ORDER BY
不是这里的直接问题。问题是多个UNION ALL
子句是否返回给定序列中的行(之前LIMIT
可以启动并阻止进一步的分支执行)。