Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Obtention d'un avertissement :la valeur nulle est éliminée par un agrégat ou une autre opération SET

Surtout, vous ne devriez rien faire à ce sujet.

  • Il est possible de désactiver l'avertissement en définissant ansi_warnings off mais cela a d'autres effets, par ex. sur la façon dont la division par zéro est gérée et peut entraîner des échecs lorsque vos requêtes utilisent des fonctionnalités telles que des vues indexées, des colonnes calculées ou des méthodes XML.
  • Dans certains cas limités, vous pouvez réécrire l'agrégat pour l'éviter. par exemple. COUNT(nullable_column) peut être réécrit sous la forme SUM(CASE WHEN nullable_column IS NULL THEN 0 ELSE 1 END) mais ce n'est pas toujours possible de le faire directement sans changer la sémantique.

C'est juste un message d'information requis dans la norme SQL. En plus d'ajouter du bruit indésirable au flux de messages, cela n'a aucun effet néfaste (à part le fait que SQL Server ne peut pas simplement contourner la lecture de NULL lignes, qui peuvent avoir une surcharge mais la désactivation de l'avertissement ne donne pas de meilleurs plans d'exécution à cet égard)

La raison pour laquelle ce message est renvoyé est que, dans la plupart des opérations en SQL, les valeurs nulles se propagent.

SELECT NULL + 3 + 7 renvoie NULL (concernant NULL en tant que quantité inconnue, cela a du sens en tant que ? + 3 + 7 est également inconnu)

mais

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

Renvoie 10 et l'avertissement indiquant que les valeurs nulles ont été ignorées.

Cependant, ce sont exactement la sémantique que vous souhaitez pour les requêtes d'agrégation typiques. Sinon la présence d'un seul NULL signifierait que les agrégations sur cette colonne sur toutes les lignes finiraient toujours par donner NULL ce qui n'est pas très utile.

Quel est le gâteau le plus lourd ci-dessous ? (Source de l'image, image Creative Commons modifiée (recadrée et annotée) par moi)

Après la pesée du troisième gâteau, la balance s'est cassée et aucune information n'est donc disponible sur le quatrième mais il était toujours possible de mesurer la circonférence.

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

La requête

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

Retours

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

même si techniquement il n'est pas possible de dire avec certitude que 80 était le poids du gâteau le plus lourd (car le nombre inconnu peut être plus grand), les résultats ci-dessus sont généralement plus utiles que de simplement renvoyer inconnu.

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

Il est donc probable que vous souhaitiez que les valeurs NULL soient ignorées, et l'avertissement vous avertit simplement du fait que cela se produit.