选择后如何对N条记录的顶部进行排序?

How to sort top of N records after selecting?

我正在使用 AdventureWorks2019 进行练习。我想 select Person.Person table 内 FirstName 列的前 10 个值,在获取值后,我想按升序对它们进行排序。

当我尝试 select 前 10 个值时,我得到了结果:

Syed
Catherine
Kim
Kim
Kim
Hazem
Sam
Humberto
Gustavo
Pilar

我想将它们排序为:

Catherine 
Gustavo 
Hazem 
Humberto 
Kim 
Kim 
Kim 
Pilar 
Sam 
Syed

这是我尝试过的方法,但失败了:

select top 10 [FirstName] from Person.Person order by [FirstName];

select * from
    (select top 10 [FirstName] from Person.Person) as persons
order by [FirstName];

with persons as (select top 10 [FirstName] from Person.Person)
select * from persons order by [FirstName];

当您不指定 ORDER BY 时,sql 服务器将 return 值以任何方便的顺序排列,不能保证它在后续处决。所以 TOP(x) 没有 ORDER BY 通常是没有意义的,因为那些 x 可以是任何 x 行。

如果您真的想对随机的 10 行进行排序,您应该像以前一样使用子查询。你可以看到 sql 服务器可以自由选择它认为合适的任何顺序,因为你没有告诉它你想要什么。

如果您真的非常想对 那些 行进行排序,您可以尝试先将它们插入到临时 table 或 table 变量中。但同样,我怀疑您会发现 sql 服务器将决定 10 个不同的行。

(某种程度上)可视化它的一个好方法是查看执行计划:没有 ORDER BY 意味着没有 sort,因此行按它们进入的顺序显示(除此之外,事情变得有点神秘。