SQL 服务器分组有些奇怪
Something strange with SQL Server grouping
我有一个关于 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
为什么?!?!
当您过滤 WHERE 0 = 1
时,没有行与过滤器匹配。
当您也不添加 group by 语句时,table 中的所有行都将被视为 1 组。因此结果计数将为 0 - 对于该组,有 0 行与过滤器匹配。
添加分组列时,SQL 服务器必须进行相同的计数,但现在按该列的每个不同值进行分组。由于您的过滤器没有 return 分组列的任何值,因此没有要进行的分组。所以结果是没有记录。
所以两者之间的区别是0组vs 1组。无结果对结果
没有 GROUP BY
always returns 行的聚合查询。过滤掉所有行后,该行上的大多数值为 NULL
。例外情况是 COUNT()
值,即 0
.
一个聚合查询,每个值组合有 GROUP BY
returns 一行。过滤掉所有行后,没有组,因此不会返回任何内容。
您的第一个查询有 GROUP BY
但过滤掉了所有行。因此,没有行。第二个查询没有GROUP BY
,所以返回一行。
我有一个关于 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
为什么?!?!
当您过滤 WHERE 0 = 1
时,没有行与过滤器匹配。
当您也不添加 group by 语句时,table 中的所有行都将被视为 1 组。因此结果计数将为 0 - 对于该组,有 0 行与过滤器匹配。
添加分组列时,SQL 服务器必须进行相同的计数,但现在按该列的每个不同值进行分组。由于您的过滤器没有 return 分组列的任何值,因此没有要进行的分组。所以结果是没有记录。
所以两者之间的区别是0组vs 1组。无结果对结果
没有 GROUP BY
always returns 行的聚合查询。过滤掉所有行后,该行上的大多数值为 NULL
。例外情况是 COUNT()
值,即 0
.
一个聚合查询,每个值组合有 GROUP BY
returns 一行。过滤掉所有行后,没有组,因此不会返回任何内容。
您的第一个查询有 GROUP BY
但过滤掉了所有行。因此,没有行。第二个查询没有GROUP BY
,所以返回一行。