获得警告:聚合或其他SET操作消除了空值

jue*_*n d 28 sql sql-server

我有这个架构

create table t(id int, d date) 

insert into t (id, d) values (1, getdate()), 
                             (2, NULL)
Run Code Online (Sandbox Code Playgroud)

做的时候

declare @mindate date    
select @mindate = min(d) from t
Run Code Online (Sandbox Code Playgroud)

我收到了警告

通过聚合或其他SET操作消除空值

为什么以及我该怎么办呢?

Mar*_*ith 94

你也可以什么都不做.

它只是SQL标准中所需的信息性消息.它没有任何不良影响.

返回此消息的原因是,在SQL空值传播的大多数操作中.

SELECT NULL + 3 + 7返回NULL(NULL作为未知数量,这是有意义的,因为? + 3 + 7也是未知的)

SELECT SUM(N)
FROM   (VALUES (NULL),
               (3),
               (7)) V(N) 
Run Code Online (Sandbox Code Playgroud)

返回10以及忽略null的警告.

但是,这些正是您对典型聚合查询所需的语义.否则,单个的存在NULL意味着在所有行上的该列上的聚合总是最终产生NULL,这不是非常有用.

哪个是下面最重的蛋糕?(图片来源,知识共享图片由我改变(裁剪和注释))

在此输入图像描述

在第三块蛋糕称重后,秤破裂,因此没有关于第四块的信息,但仍然可以测量周长.

+--------+--------+---------------+
| CakeId | Weight | Circumference |
+--------+--------+---------------+
|      1 | 50     | 12.0          |
|      2 | 80     | 14.2          |
|      3 | 70     | 13.7          |
|      4 | NULL   | 13.4          |
+--------+--------+---------------+
Run Code Online (Sandbox Code Playgroud)

查询

SELECT MAX(Weight)        AS MaxWeight,
       AVG(Circumference) AS AvgCircumference
FROM   Cakes 
Run Code Online (Sandbox Code Playgroud)

返回

+-----------+------------------+
| MaxWeight | AvgCircumference |
+-----------+------------------+
|        80 |          13.325  |
+-----------+------------------+
Run Code Online (Sandbox Code Playgroud)

即使从技术上讲,也不可能肯定地说80是最重的蛋糕的重量(因为未知的数字可能更大),上述结果通常比简单地返回未知数更有用.

+-----------+------------------+
| MaxWeight | AvgCircumference |
+-----------+------------------+
|         ? |          13.325  |
+-----------+------------------+
Run Code Online (Sandbox Code Playgroud)

因此,您可能希望忽略NULL,并且警告只会提醒您发生这种情况.

  • 尽管我多次对无效传播感到恼火,但我想我从来没有真正质疑它背后的推理.任何可以让我"oohhhhh"或涉及饼干的答案都得到了我的投票. (10认同)