2013-03-26 43 views
1

我爲我的生活不能看到我在這裏失蹤,但能有人指出我爲什麼第一個查詢不會做我想做的,但第二個工作正常?我知道查詢不完全一樣,但它們應該返回相同的20行,但它們不會。 (查詢填充發現在一個表中的前20種最常見的物品)簡單如果已存在與在

select distinct 
      rx.drug_class 
     from rx 
     where exists 
     (
      select top 20  
        rx2.drug_class 
        ,COUNT(distinct rx2.pat_id) as counts 
        ,RANK() over(order by count(distinct pat_id) desc) as rn 
        from rx as rx2 
        --when the line below is commented out 
        --this subquery gives the correct answer 
        where rx.drug_class = rx2.drug_class 
        group by rx2.drug_class 
     ) 

這一個正常工作

select distinct 
     rx.drug_class 
     from rx 
     where rx.drug_class in 
     (
      select top 20 rx.drug_class 
       from rx 
       group by rx.drug_class 
       order by COUNT(distinct pat_id) desc 
     ) 

where子句中已存在子查詢不工作,怎麼辦?

+0

你確定註釋掉了哪裏rx.drug_class = rx2.drug_class使它工作。刪除主查詢的鏈接將Exists子句轉換爲'EXISTS(SELECT * FROM rx)' – 2013-03-26 18:26:23

回答

5

即使你分配用於第一個查詢行號,你仍然需要ORDER BY此行號:

where rx.drug_class = rx2.drug_class 
group by rx2.drug_class 
order by rn 

另外,我假定這只是一個簡單的例子,因爲以下將工作一樣好:

select top 20 rx.drug_class 
from rx 
group by rx.drug_class 
order by COUNT(distinct pat_id) desc 

編輯:

EXISTS因爲你限制設置爲MA也將無法正常工作在執行計數之前將內部SELECT中的行排列到外部集合中的行......因此在該情況下該行將始終存在於top 20計數中。

IN的作品,因爲它是所有行一組數... ...的EXISTS因爲數據統計外設置每個行正在做的失敗......所以外集的每一行是在當這些計數僅限於外排drug_class時,排名前20位。

+1

這是爲什麼?如果我註釋掉引用外部查詢的地方,按照 – wootscootinboogie 2013-03-26 18:19:20

+0

的順序得到結果集,我用附加的命令運行了相同的查詢,並且我仍然得到相同的結果集。 – wootscootinboogie 2013-03-26 18:20:45

+0

我問,因爲我不知道爲什麼'存在'子查詢不起作用。 :) – wootscootinboogie 2013-03-26 18:21:27

1

據我所知EXISTS子句只是返回。因此,如果子查詢中存在EXISTS 20行,則表示TRUE,而不是IN子句中的過濾器。