sql >> Base de Datos >  >> RDS >> Sqlserver

Obteniendo advertencia:el valor nulo se elimina mediante un agregado u otra operación SET

En general, no debes hacer nada al respecto.

  • Es posible deshabilitar la advertencia configurando ansi_warnings apagado pero esto tiene otros efectos, p. sobre cómo se maneja la división por cero y cómo puede causar fallas cuando sus consultas usan funciones como vistas indexadas, columnas calculadas o métodos XML.
  • En algunos casos limitados, puede volver a escribir el agregado para evitarlo. p.ej. COUNT(nullable_column) se puede reescribir como SUM(CASE WHEN nullable_column IS NULL THEN 0 ELSE 1 END) pero esto no siempre es posible de hacer directamente sin cambiar la semántica.

Es solo un mensaje informativo requerido en el estándar SQL. Además de agregar ruido no deseado al flujo de mensajes, no tiene efectos negativos (aparte de que SQL Server no puede simplemente pasar por alto la lectura de NULL filas, que pueden tener una sobrecarga pero deshabilitar la advertencia no brinda mejores planes de ejecución a este respecto)

La razón para devolver este mensaje es que en la mayoría de las operaciones en SQL se propagan nulos.

SELECT NULL + 3 + 7 devuelve NULL (con respecto a NULL como una cantidad desconocida esto tiene sentido como ? + 3 + 7 también se desconoce)

pero

SELECT SUM(N)
FROM   (VALUES (NULL),
               (3),
               (7)) V(N) 

Devuelve 10 y la advertencia de que se ignoraron los nulos.

Sin embargo, estas son exactamente la semántica que desea para consultas de agregación típicas. De lo contrario, la presencia de un solo NULL significaría que las agregaciones en esa columna en todas las filas siempre terminarían produciendo NULL lo cual no es muy útil.

¿Cuál es el pastel más pesado a continuación? (Fuente de la imagen, imagen de Creative Commons alterada (recortada y anotada) por mí)

Después de pesar el tercer pastel, la balanza se rompió, por lo que no hay información disponible sobre el cuarto, pero aún fue posible medir la circunferencia.

+--------+--------+---------------+
| CakeId | Weight | Circumference |
+--------+--------+---------------+
|      1 | 50     | 12.0          |
|      2 | 80     | 14.2          |
|      3 | 70     | 13.7          |
|      4 | NULL   | 13.4          |
+--------+--------+---------------+

La consulta

SELECT MAX(Weight)        AS MaxWeight,
       AVG(Circumference) AS AvgCircumference
FROM   Cakes 

Devoluciones

+-----------+------------------+
| MaxWeight | AvgCircumference |
+-----------+------------------+
|        80 |          13.325  |
+-----------+------------------+

aunque técnicamente no es posible decir con certeza que 80 fue el peso del pastel más pesado (ya que el número desconocido puede ser mayor), los resultados anteriores son generalmente más útiles que simplemente devolver un valor desconocido.

+-----------+------------------+
| MaxWeight | AvgCircumference |
+-----------+------------------+
|         ? |          13.325  |
+-----------+------------------+

Es muy probable que desee que se ignoren los valores NULL, y la advertencia solo lo alerta sobre el hecho de que esto está sucediendo.