Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Obtendo aviso:o valor nulo é eliminado por uma operação agregada ou outra SET


Principalmente você não deve fazer nada sobre isso.
  • É possível desativar o aviso configurando ansi_warnings desligado, mas isso tem outros efeitos, por exemplo. sobre como a divisão por zero é tratada e pode causar falhas quando suas consultas usam recursos como visualizações indexadas, colunas computadas ou métodos XML.
  • Em alguns casos limitados, você pode reescrever o agregado para evitá-lo. por exemplo. COUNT(nullable_column) pode ser reescrito como SUM(CASE WHEN nullable_column IS NULL THEN 0 ELSE 1 END) mas nem sempre é possível fazer isso sem alterar a semântica.

É apenas uma mensagem informativa exigida no padrão SQL. Além de adicionar ruído indesejado ao fluxo de mensagens, ele não tem efeitos negativos (além de significar que o SQL Server não pode simplesmente ignorar a leitura de NULL rows, que podem ter uma sobrecarga, mas desabilitar o aviso não oferece melhores planos de execução a esse respeito)

A razão para retornar esta mensagem é que na maioria das operações em SQL os nulos se propagam.

SELECT NULL + 3 + 7 retorna NULL (em relação a NULL como uma quantidade desconhecida, isso faz sentido como ? + 3 + 7 também é desconhecido)

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

Retorna 10 e o aviso de que os nulos foram ignorados.

No entanto, estas são exatamente a semântica que você deseja para consultas de agregação típicas. Caso contrário, a presença de um único NULL significaria que as agregações nessa coluna em todas as linhas sempre acabariam gerando NULL o que não é muito útil.

Qual ​​é o bolo mais pesado abaixo? (Fonte da imagem, imagem Creative Commons alterada (cortada e anotada) por mim)



Após a pesagem do terceiro bolo, a balança quebrou e não há informações sobre o quarto, mas ainda foi possível medir a circunferência.
+--------+--------+---------------+
| CakeId | Weight | Circumference |
+--------+--------+---------------+
|      1 | 50     | 12.0          |
|      2 | 80     | 14.2          |
|      3 | 70     | 13.7          |
|      4 | NULL   | 13.4          |
+--------+--------+---------------+

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

Devoluções
+-----------+------------------+
| MaxWeight | AvgCircumference |
+-----------+------------------+
|        80 |          13.325  |
+-----------+------------------+

mesmo que tecnicamente não seja possível dizer com certeza que 80 foi o peso do bolo mais pesado (pois o número desconhecido pode ser maior) os resultados acima são geralmente mais úteis do que simplesmente retornar desconhecido.
+-----------+------------------+
| MaxWeight | AvgCircumference |
+-----------+------------------+
|         ? |          13.325  |
+-----------+------------------+

É provável que você queira que os NULLs sejam ignorados, e o aviso apenas o alerta para o fato de que isso está acontecendo.