Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql order by并选择top执行顺序_Sql_Sql Server_Select_Sql Order By - Fatal编程技术网

Sql order by并选择top执行顺序

Sql order by并选择top执行顺序,sql,sql-server,select,sql-order-by,Sql,Sql Server,Select,Sql Order By,我有一个基于两个值返回记录间隔的查询 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

我有一个基于两个值返回记录间隔的查询

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
ID      Name                                CountryCode
4079    Rafah                               PSE
4078    Nablus                              PSE
4077    Jabaliya                            PSE
这是城市表中的日期:

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
5   Amsterdam                           NLD
4   Mazar-e-Sharif                      AFG
3   Herat                               AFG
ID      Name                                CountryCode
4079    Rafah                               PSE
4078    Nablus                              PSE
4077    Jabaliya                            PSE

问题出在哪里?

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

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


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

你没有得到什么?您有两个不同的查询,它们返回两个不同的结果集。老实说,我不知道哪里会出现混乱。有一点需要注意:当使用TOP`时,请始终使用orderby1。当我执行两个子查询:“从城市中选择前5位ID、姓名、国家代码”和“从城市顺序中选择前5位ID、姓名、国家代码”时,我会得到相同的结果!那么,为什么在同一个父查询中使用它们会得到不同的结果呢<代码>前5条无排序依据选择5条随机记录。如果这5条记录是您期望的记录,则这是一个意外,因为没有排序依据的
TOP
不稳定。除非显式指定顺序,否则SQL结果集是无序的。可能需要一些时间来适应,但这就是语言的工作方式。