SQL 规范定义了以下语法规则:
<query expression> ::=
[ <with clause> ]
<query expression body>
[ <order by clause> ]
[ <result offset clause> ]
[ <fetch first clause> ]
<query expression body> ::=
<query term>
| <query expression body> UNION [ ALL | DISTINCT ] [ <corresponding spec> ] <query term>
| <query expression body> EXCEPT [ ALL | DISTINCT ] [ <corresponding spec> ] <query term>
<query term> ::=
<query primary>
| <query term> INTERSECT [ ALL | DISTINCT ] [ <corresponding spec> ] <query primary>
<query primary> ::=
<simple table>
| <left paren>
<query expression body>
[ <order by clause> ]
[ <result offset clause> ]
[ <fetch first clause> ]
<right paren>
带括号的查询是一个<query expression>
只包含一个<query primary>
形状的<left paren> <query expression body> ... <right paren>
此外,它指定:
a) 如果QE
不立即包含<order by clause>
,则行的顺序T
取决于实现。
(量化宽松是<query expression>
)
因此,由于在<query expression>
括号中的情况下 不立即包含 ORDER BY 子句,<query primary>
因此不能保证排序。
Presto 优化了这种情况并产生警告,表明您可能无法获得预期的结果:
presto> (SELECT x FROM (VALUES 1) t(x) ORDER BY x);
x
---
1
(1 row)
WARNING: ORDER BY in subquery may have no effect
要获得所需的顺序,您需要确保ORDER BY
子句位于顶层,或者按照其他回复中的建议删除括号,或者将其移到括号外:
(SELECT ...)
ORDER BY 1 DESC