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

时间:2017-10-20 10:03:29

标签: sql-server tsql

请参阅以下查询:

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

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

如果我删除了聚合函数,我会得到一个空的结果集:

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

为了说清楚,如果我删除了错误的谓词,那么查询将返回2行,其值为3和4,用于列'VAL'

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

2 个答案:

答案 0 :(得分:1)

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

这是我的努力。

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

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

答案 1 :(得分:-1)

  

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

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

  

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

但是在上面它返回空结果集,因为我们试图根据一个甚至不存在的特定项来总结这些值(在你的示例中为false谓词)。这是sql server的正常行为