首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sql order并选择顶层执行顺序

Sql order并选择顶层执行顺序
EN

Stack Overflow用户
提问于 2015-10-19 16:04:23
回答 1查看 3.6K关注 0票数 0

我有以下查询,它根据两个值返回记录的间隔

代码语言:javascript
复制
SELECT TOP 3 
    a.* 
FROM 
    (SELECT TOP 5 
         ID, Name, CountryCode 
     FROM city 
     ORDER BY ID) a 
ORDER BY  
     ID desc

结果:

代码语言:javascript
复制
ID  Name                                CountryCode
5   Amsterdam                           NLD
4   Mazar-e-Sharif                      AFG
3   Herat                               AFG

这是来自城市表的日期:

代码语言:javascript
复制
ID  Name                            CountryCode
1   Kabul                               AFG
2   Qandahar                            AFG
3   Herat                               AFG
4   Mazar-e-Sharif                      AFG
5   Amsterdam                           NLD
6   Rotterdam                           NLD
7   Haag                                NLD
8   Utrecht                             NLD
9   Eindhoven                           NLD
10  Tilburg                             NLD
11  Groningen                           NLD
.   .                                   .
.   .                                   .
4076    Hebron                          PSE
4077    Jabaliya                        PSE
4078    Nablus                          PSE
4079    Rafah                           PSE

但是,当我从子查询中移除order时,会得到一个不同的结果:

代码语言:javascript
复制
SELECT TOP 3 
    a.* 
FROM 
    (SELECT TOP 5 
         ID, Name, CountryCode 
     FROM city) a 
ORDER BY 
     ID asc

结果:

代码语言:javascript
复制
ID      Name                                CountryCode
4079    Rafah                               PSE
4078    Nablus                              PSE
4077    Jabaliya                            PSE

问题出在哪里?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-19 16:14:43

order将首先发生在select top指令之前。因此,在您已经给出的示例中,它将按id的顺序排序,然后选择前5条记录。这是一个子查询,因此外部查询将按ids降序这5条记录,然后选择前3条。

当您在子查询中删除order时,top 5指令只返回它遇到的前5条记录。如果表中有聚集索引,这可能会受到聚集索引的影响,因此,如果ID是聚集的,则可能会给出相同的结果,但如果像创建日期那样影响到顺序,则返回结果。请注意,即使考虑到聚集索引,也不能保证它在订单上得到保证。查询并行性也可能发挥作用。

基本上,检查表上的聚集索引,因为这可能指示顺序,但不能保证顺序。希望这是合理的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33219040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档