【发布时间】:2020-01-16 11:05:12
【问题描述】:
注意:虽然我目前的重点是 tsql,但这很可能是一个更一般的 sql 问题。
考虑以下有效但也是伪代码示例查询:
select
desiredKeyCols,
case count(distinct productID)
when 0 then '0'
when 1 then '1'
else '2+'
end as [Product Count Classification]
from orders
group by desiredKeyCols
对于每个 desiredKeyCols,字段 [产品计数分类] 将返回 0,如果没有关联的 productIDs,1 表示 1,2+ 表示任何更高的数字。但是,count(distinct productID) 一旦达到 2 就不会停止计算。它会愉快地继续无穷大,然后另一个操作将计算 case。
我已经多次看到同样的事情发生了。
有没有更有效的方法来实现这一点?如果我们只想要 0/1+ 类,答案是半联接(in/exists)。但是任意数量的范围呢?
【问题讨论】:
-
可能不会。在某些数据库中,
count(distinct)的效率非常低,并且有针对逻辑的变通方法——但它们都没有停在“3”处。但是,据我所知,SQL Server 有一个合理的实现。 -
@GordonLinoff 让您的专家自我说“不”是实现的噩梦......
-
此查询将扫描和分组
orders,因为那是您的分组列的来源。你的聚合表达式是什么并不重要。
标签: sql sql-server tsql query-performance