以下是否是 SQL 标准中的确定性行为?
SELECT *
FROM (
SELECT *
FROM myTable
ORDER BY name ASC
)
或者在子选择中“order-by”基本上被丢弃了吗?当然,“正确”的做法是将其放在ORDER BY
外部选择中。但是,在我的用例中,最终用户向我传递了一个已经创建的 SQL 语句,我必须将其包装在添加一些额外行为的子选择中。
以下是否是 SQL 标准中的确定性行为?
SELECT *
FROM (
SELECT *
FROM myTable
ORDER BY name ASC
)
或者在子选择中“order-by”基本上被丢弃了吗?当然,“正确”的做法是将其放在ORDER BY
外部选择中。但是,在我的用例中,最终用户向我传递了一个已经创建的 SQL 语句,我必须将其包装在添加一些额外行为的子选择中。
内部查询中可能发生(或不可能发生)的排序不会保留在外部查询中
SELECT *
。 SQL 优化器可能足够聪明,能够意识到内部查询ORDER BY
不会影响结果集,并删除该排序。 否则,您将付出排序的代价而得不到任何好处。在最终结果集中获得所需顺序的唯一方法是添加
ORDER BY
外部查询子句。如果您无法做到这一点,那么您需要重新考虑您的方法。这不是对 ANSI-92 标准的原始引用,但 MariaDB 网站上的这个讨论提到
ORDER BY
ANSI SQL 不允许在子查询中使用:https ://mariadb.com/kb/en/why-is-order-by-in-a-from-subquery-ignored/然而,讨论继续指出 MariaDB 允许该语法,因为
ORDER BY
由于LIMIT
排序,结果集发生了变化。从ANSI标准来看,
ORDER BY
只有在最外层查询中才是可靠的。在使用不同的数据库管理系统时,您遇到的行为在每个示例中大体上都会有所不同。
请记住 - SQL 及其基本范式与集合论有关,而非数组。集合是无序的。
事实上,当在括号中的子查询中
ORDER BY
遇到子句时,DBMS 会抛出语法错误。该查询是有效的 ISO/ANSI SQL:2016(以及 SQL:2023)。
https://developer.mimer.com/sql-2016-validator/
F851、F850 和 F591 都是可选功能。
但是,子查询
ORDER BY
在这里没有意义,子查询之外的顺序没有保留。或者