2015-02-10 58 views
0

我有一個使用子查詢來查詢數據子集的查詢,然後我試圖從子查詢中選擇特定的數據。子查詢:針對子查詢的查詢產生與單獨運行子查詢不同的結果

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函數並不能提供我需要的值。我假設子查詢返回外部查詢操作的一組數據,但在上例中似乎不是這種情況。

對此有何幫助?

回答

4

您正在運行未選擇排序的前10名。爲了得到你想要的結果,你需要在那裏訂購。

+0

呵呵。 a)我不認爲你可以通過子查詢指定順序,b)我不確定我明白爲什麼這很重要。如果子查詢返回如第一個示例中所示的一組數據,那麼外部查詢操作的是什麼?它的工作原理,但我不完全確定爲什麼... – 2015-02-10 15:28:24

+0

你可以(也可能應該)始終用頂部指定順序。如果你不是SQL Server可以跳過的東西,或者例如並行性會導致不同類型的結果。實際執行計劃可能會揭示爲什麼發生這種情況 – 2015-02-10 15:44:26