SQL命令通过选择顶部执行顺序

问题描述:

我有以下查询,基于两个值SQL命令通过选择顶部执行顺序

返回记录的间隔
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 
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 

但是,当我从子查询中删除命令时,我得到了不同的结果:

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 

问题出在哪里!?我无法得到它!

+2

你没有得到什么?你有两个不同的查询,他们返回两个不同的结果集。我真的不知道哪里会出现混淆。一点指导:当你使用'TOP'时总是使用'ORDER BY1'。 –

+0

当我执行两个subquerys:'选择TOP 5 ID,名称,国家代码从城市'和'选择TOP 5 ID,名称,国家代码从城市秩序编号' 我得到相同的结果!那么为什么在同一个父查询中使用它们给了我们不同的结果! –

+1

没有'order by'的'top 5'选择5条随机记录。如果这5条记录是你所期望的,那么它的事故 –

按顺序将会在选择顶部指令前先发生。因此,在你给出的例子中,它会按ID排序,然后选择前5个记录。这是一个子查询,所以外部查询将按照降序排列这5条记录,然后选择前3位。

当您通过子查询中删除顺序时,前5条指令将简单地返回它遇到的前5个记录。如果表中有一个聚集索引,可能会受到聚集索引的影响,因此如果聚集ID,它可能会得到相同的结果,但是如果它是其他内容就像创建的日期一样会影响结果返回的顺序。请注意,即使考虑聚集索引,订单也无法保证。查询并行性也可能发挥作用。

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