Sql server 选择后如何对N条记录中的前几条进行排序?

Sql server 选择后如何对N条记录中的前几条进行排序?,sql-server,sql-order-by,adventureworks,Sql Server,Sql Order By,Adventureworks,我在用冒险来练习。我想在Person.Person表中选择FirstName列的前10个值,在获得这些值后,我想按升序对它们进行排序 当我尝试选择前10个值时,我得到的结果是: Syed Catherine Kim Kim Kim Hazem Sam Humberto Gustavo Pilar 我想将它们分类为: Catherine Gustavo Hazem Humberto Kim Kim Kim Pilar Sam Syed 这是我尝试过的,但失败了: select

我在用冒险来练习。我想在
Person.Person
表中选择
FirstName
列的前10个值,在获得这些值后,我想按升序对它们进行排序

当我尝试选择前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];


当您不指定一个
ORDER BY
时,sql server将以任何方便的顺序返回值,但不能保证在后续执行时它会保持不变。因此,没有排序依据的
TOP(x)
通常是没有意义的,因为这些x可以是任意x行

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

如果您真的想对这些行进行排序,可以尝试先将它们插入到临时表或表变量中。但是,我再次怀疑您会发现SQLServer将决定10个不同的行


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

谢谢!它让我想到OOP语言(C#,Java…)中的引用类型
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];