当谓词为 false 时,聚合返回非空结果集的 T-SQL 查询



请参考以下查询:

SELECT SUM(n) AS SUMVAL FROM (values(3),(4)) AS tbl(n) WHERE 1=0

由于我提供了一个 false 的谓词,我会假设它返回一个空的结果集(0 行)。但它返回一行 NULL 的行。这是一个错误吗?或者这种行为是否有有效的解释。

如果我删除聚合函数,我会按预期得到一个空结果集:

SELECT n AS VAL FROM (values(3),(4)) AS tbl(n) WHERE 1=0

为了清楚起见,如果我删除 false 谓词,那么查询将为列"VAL"返回 2 行值分别为 3 和 4 的行

SELECT n AS VAL FROM (values(3),(4)) AS tbl(n)

但是如果我使用带有 GROUP BY 子句的聚合函数,如下面的查询所示,我会得到预期的结果(空行集)

SELECT id, SUM(n) AS SUMVAL FROM (values(1,3.0),(2,4.0)) AS tbl(id,n) WHERE 1=0 GROUP BY id

我最近遇到了这个问题,因为它在一段代码中引起了一个主要的OOPS。

这是我的尝试。

COUNT 不是聚合行集数据的属性,而是关于行集本身的聚合。 所以 0 是有道理的。 SUM(以及 MAX、MIN 等)是行集数据的聚合属性。 如果没有要聚合的行,该值未定义,但确实存在。例如,无的 SUM 是无(不是零)。 无的最大值是什么都没有。

现在,第二种情况,有一个GROUP BY。 GROUP BY 中的聚合有点像 foreach 循环。 它问,对于 GROUP BY 定义的每个组,聚合值是多少? 当没有要分组的行时,循环永远不会执行,因此不会返回任何内容。 没有组,并且由于它每个组返回一行,因此它不返回任何内容。

从 (值 (3),(4)) 中选择 SUM(N) 作为 SUMVAL,其中 1=0

与上述情况一样,当谓词为 false 时,仅选择聚合值返回 NULL,因为我们没有任何满足谓词条件的行。

从 (值 (1,3.0),(2,4.0)) 中选择 ID, SUM(N) 作为 SUMVAL AS TBL(ID,N) 其中 1=0 按 ID 分组

但是在上面,它返回空的结果集,因为我们尝试根据甚至不存在的特定项目(在您的示例中为 false 谓词)对值进行汇总。这是 sql 服务器的正常行为

最新更新