选择后如何对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
,因此行按它们进入的顺序显示(除此之外,事情变得有点神秘。
我正在使用 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
,因此行按它们进入的顺序显示(除此之外,事情变得有点神秘。