【问题标题】:Something strange with SQL Server groupingSQL Server 分组有些奇怪
【发布时间】:2020-10-30 23:36:43
【问题描述】:
我有一个关于 group by 发生了什么的问题。
例如:
select COUNT(*)
from
(select 0 c1) t1
where 0 = 1
group by t1.c1
结果 - 没有记录
select COUNT(*)
from
(select 0 c1) t1
where 0 = 1
--group by t1.c1
结果 - 0
为什么?!?!
【问题讨论】:
标签:
sql
sql-server-2008
group-by
【解决方案1】:
没有GROUP BY的聚合查询总是返回一行。过滤掉所有行后,该行上的大多数值为NULL。例外是 COUNT() 的值是 0。
带有GROUP BY 的聚合查询为每个值组合返回一行。过滤掉所有行后,没有分组,所以什么也没有返回。
您的第一个查询有一个GROUP BY,但过滤掉了所有行。因此,没有行。第二个查询没有GROUP BY,所以返回一行。
【解决方案2】:
当您过滤 WHERE 0 = 1 时,没有任何行会匹配过滤器。
如果您也没有添加 group by 语句,则该表中的所有行都将被视为 1 个组。所以结果计数将为 0 - 对于该组,有 0 行与过滤器匹配。
添加分组列时,SQL Server 必须执行相同的计数,但现在按该列的每个不同值进行分组。由于您的过滤器不会为分组列返回任何值,因此没有要创建的组。所以结果是没有记录。
所以两者的区别是 0 组 vs 1 组。没有结果与结果。