Sql server 对子查询的查询产生的结果与单独运行子查询不同

Sql server 对子查询的查询产生的结果与单独运行子查询不同,sql-server,tsql,Sql Server,Tsql,我有一个使用子查询来子集数据的查询,然后我尝试从子查询中选择特定的数据。子查询是: select top 10 Build_ID, Appscan_Definitive_High, rank() over (order by Appscan_Definitive_High desc) as rankpct from ( select build_id, convert(int,appscan_definitive_high) as appscan_definitive_h

我有一个使用子查询来子集数据的查询,然后我尝试从子查询中选择特定的数据。子查询是:

select top 10 Build_ID, Appscan_Definitive_High,
rank() over (order by Appscan_Definitive_High desc) as rankpct
from 
(
select build_id, convert(int,appscan_definitive_high) as
           appscan_definitive_high
from dbo.SDFBuildMetrics
where coalesce(appscan_definitive_high,0)>0
) a 
其结果是:

Build_ID    Appscan_Definitive_High rankpct
31966   51  1
32627   51  1
44293   51  1
47011   51  1
47968   51  1
48554   51  1
25586   49  7
27370   49  7
40357   48  9
23867   44  10
但当我对子查询运行查询时:

select Appscan_Definitive_High
from
(
select top 10 Build_ID, Appscan_Definitive_High,
    rank() over (order by Appscan_Definitive_High desc) as rankpct
from 
(
    select build_id, convert(int,appscan_definitive_high) as
                appscan_definitive_high
    from dbo.SDFBuildMetrics
    where coalesce(appscan_definitive_high,0)>0
) a 
 ) aa
我得到:

Appscan_Definitive_High
1
44
21
44
2
44
2
6
7
7
完整查询的最终目的是检索min(AppScan\u definalite\u High),但由于返回的值集与子查询返回的值集不匹配,因此min函数无法满足我的需要。我假设子查询返回外部查询所针对的一组数据,但在上面的示例中似乎并非如此


这方面有什么帮助吗?

您正在运行无订单选择前10名。要获得您想要的结果,您需要在那里设置order by。

您正在运行的是选择前10名而不选择order by。要得到你想要的结果,你需要在那里有秩序。

Huh。a) 我不认为您可以在子查询上指定order by,并且b)我不确定我是否理解这有什么关系。如果子查询返回如第一个示例所示的一组数据,那么外部查询的操作是什么?它是有效的,但我不完全确定为什么……您可以(也可能应该)始终使用top指定orderby。如果您不这样做,SQL Server可能会跳过一些事情,例如,并行性可能会导致不同类型的结果。实际的执行计划可能会揭示这一切发生的原因。a) 我不认为您可以在子查询上指定order by,并且b)我不确定我是否理解这有什么关系。如果子查询返回如第一个示例所示的一组数据,那么外部查询的操作是什么?它是有效的,但我不完全确定为什么……您可以(也可能应该)始终使用top指定orderby。如果您不这样做,SQL Server可能会跳过一些事情,例如,并行性可能会导致不同类型的结果。实际执行计划可能会揭示为什么会发生这种情况。