Sql order by 和 select 最高执行顺序

Sql order by and select top execution order

我有以下查询 returns 基于两个值的记录区间

SELECT TOP 3 
    a.* 
FROM 
    (SELECT TOP 5 
         ID, Name, CountryCode 
     FROM city 
     ORDER BY ID) a 
ORDER BY  
     ID desc

结果:

ID  Name                                CountryCode
5   Amsterdam                           NLD
4   Mazar-e-Sharif                      AFG
3   Herat                               AFG

这是来自城市 table 的日期:

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 by 时,我得到了不同的结果:

SELECT TOP 3 
    a.* 
FROM 
    (SELECT TOP 5 
         ID, Name, CountryCode 
     FROM city) a 
ORDER BY 
     ID asc

结果:

ID      Name                                CountryCode
4079    Rafah                               PSE
4078    Nablus                              PSE
4077    Jabaliya                            PSE

问题出在哪里?

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

当您在子查询中删除顺序时,top 5 指令将简单地 return 它遇到的前 5 条记录。如果 table 上有聚簇索引,则这可能会受到聚簇索引的影响,因此如果 ID 是聚簇索引,则可能会给出相同的结果,但如果它是创建日期之类的会影响顺序的其他内容,则结果为 return编辑。请注意,即使考虑到聚集索引,也不能保证订单上的内容。查询并行性也可能发挥作用。

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