简单存在与存在的关系

时间:2013-03-26 18:15:39

标签: sql sql-server

我为我的生活看不到我在这里缺少的东西,但有人可以指出我为什么第一个查询没有做我想要的,但第二个工作正常吗?我知道查询不完全相同,但它们应该返回相同的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 
        )

Exists子查询中的where子句不起作用,是什么给出了?

2 个答案:

答案 0 :(得分: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也无效,因为您在执行计数之前将内部SELECT中的行限制为匹配外部集合中的行...所以行始终为在这种情况下,top 20计数中存在。

IN有效,因为它是所有行的一组计数... EXISTS失败,因为正在对外部集合中的每一行进行计数...所以每一行在外部集合中,当这些计数仅限于外部行drug_class时,它位于前20个计数中。

答案 1 :(得分:1)

据我所知EXISTS子句只返回 TRUE FALSE 。因此,如果从子查询中排出20行,则表示 TRUE ,而不是与IN子句一样的过滤器。