0

这是我的问题,我被要求确保一个大项目中的语句都被包裹起来:

Select * from (Select ... order by column)

保持他们的订单。这就引出了一个问题,是否有一些官方来源定义 SQL 选择结果保持其顺序?

将此场景设置为可抓取但最小的上下文:

假设您有一个名为 exampleTBL 的表,其中包含 A 和 B 列。您执行以下语句:

Select * from (Select B from exampleTBL order by A);

独立于使用的结果是否DBMS/Driver/Platform/...会由 A 排序?

4

2 回答 2

1

不,不是每个数据库都支持在子查询中排序,所以你应该在外部查询中定义顺序(或者更好的是去掉外部查询)。此外,如果您想确保获得相同的结果,您应该按顺序包括您选择的每一列。最后,无论是否使用索引,外部的 order by 都不会改变。

于 2013-03-06T11:09:58.180 回答
1

来自SQL-2003 标准(71WD2-02-Foundation-2011-12):


4.15.3 派生表

派生表是通过对表达式(例如 a <joined table><data change delta table><query expression>或)求值直接或间接从一个或多个其他表派生的表<table expression>。A <query expression>可以包含一个可选的 . 由 指定的表的行的顺序<query expression>仅对<query expression>直接包含 的有保证<order by clause>


因此,DBMS 没有义务在子查询中维护 order by。在您的示例中,只需使用:

Select B from (Select B, A from exampleTBL) t order by A;

无论您的 DBMS 是否维护订单,我都会推荐这种方法。

于 2013-03-06T11:37:41.297 回答