子查询中的SQL Server ORDER BY子句

nar*_*yan 5 sql sql-server

我在SQL Server中遇到一个奇怪的错误,我想要一些解释.

例如,当我ORDER BY在子查询中写字时

SELECT a FROM (SELECT * FROM A ORDER BY a) T
Run Code Online (Sandbox Code Playgroud)

它会引发以下错误

除非还指定了TOP或FOR XML,否则ORDER BY子句在视图,内联函数,派生表,子查询和公用表表达式中无效.

但是当我TOP在子查询中使用时,它正常工作

 SELECT a 
 FROM
    (SELECT TOP 1000000 * FROM A ORDER BY a) T
Run Code Online (Sandbox Code Playgroud)

那么,这是否意味着我可以选择A的顶行数,而不是

SELECT a FROM (SELECT * FROM A ORDER BY a) T
Run Code Online (Sandbox Code Playgroud)

在这种情况下.错误的原因是什么?

Ole*_*Dok 4

对子查询进行排序并从中选择某些内容没有多大意义 - 不能保证顶级选择将被排序,因此 - 对内部查询进行排序是没有意义的

但是,如果您使用TOP语句对内部查询进行排序 - 它也不能保证顶级选择将以这种方式排序,但它将仅包含内部查询中的前 X 行 - 这已经是有意义的。