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

问题描述:

我有一个使用子查询来查询数据子集的查询,然后我试图从子查询中选择特定的数据。子查询:针对子查询的查询产生与单独运行子查询不同的结果

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 

完整查询的最终目的是r etrieve min(AppScan_Definitive_High),但由于返回的值集合与子查询返回的值集合不匹配,min函数并不能提供我需要的值。我假设子查询返回外部查询操作的一组数据,但在上例中似乎不是这种情况。

对此有何帮助?

您正在运行未选择排序的前10名。为了得到你想要的结果,你需要在那里订购。

+0

呵呵。 a)我不认为你可以通过子查询指定顺序,b)我不确定我明白为什么这很重要。如果子查询返回如第一个示例中所示的一组数据,那么外部查询操作的是什么?它的工作原理,但我不完全确定为什么... – 2015-02-10 15:28:24

+0

你可以(也可能应该)始终用顶部指定顺序。如果你不是SQL Server可以跳过的东西,或者例如并行性会导致不同类型的结果。实际执行计划可能会揭示为什么发生这种情况 – 2015-02-10 15:44:26