2013-03-26 18 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子句中的过滤器。