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