sql >> Databasteknik >  >> RDS >> Sqlserver

Får varning:Nullvärde elimineras av en sammanlagd eller annan SET-operation

För det mesta bör du inte göra något åt ​​det.

  • Det är möjligt att inaktivera varningen genom att ställa in ansi_warnings av men detta har andra effekter, t.ex. om hur division med noll hanteras och kan orsaka misslyckanden när dina frågor använder funktioner som indexerade vyer, beräknade kolumner eller XML-metoder.
  • I vissa begränsade fall kan du skriva om aggregatet för att undvika det. t.ex. COUNT(nullable_column) kan skrivas om som SUM(CASE WHEN nullable_column IS NULL THEN 0 ELSE 1 END) men detta är inte alltid möjligt att göra enkelt utan att ändra semantiken.

Det är bara ett informationsmeddelande som krävs i SQL-standarden. Förutom att lägga till oönskat brus till meddelandeströmmen har det inga negativa effekter (förutom att SQL Server inte bara kan kringgå läsning av NULL rader, som kan ha en overhead men att inaktivera varningen ger inte bättre utförandeplaner i detta avseende)

Anledningen till att det här meddelandet returneras är att de flesta operationer i SQL sprider sig nollvärden.

SELECT NULL + 3 + 7 returnerar NULL (avseende NULL som en okänd kvantitet är detta vettigt som ? + 3 + 7 är också okänd)

men

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

Returnerar 10 och varningen om att nollor ignorerades.

Men det här är exakt den semantik du vill ha för typiska aggregeringsfrågor. Annars förekomsten av en enda NULL skulle innebära att aggregering av den kolumnen över alla rader alltid skulle ge NULL vilket inte är särskilt användbart.

Vilken är den tyngsta kakan nedan? (Bildkälla, Creative Commons-bild ändrad (beskuren och kommenterad) av mig)

Efter att den tredje tårtan vägts gick vågen sönder och det finns ingen information om den fjärde, men det var fortfarande möjligt att mäta omkretsen.

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

Frågan

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

Retur

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

även om det tekniskt inte är möjligt att med säkerhet säga att 80 var vikten av den tyngsta kakan (eftersom det okända antalet kan vara större) är resultaten ovan generellt sett mer användbara än att bara returnera okända.

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

Så troligtvis vill du att NULL-värden ska ignoreras, och varningen uppmärksammar dig bara på att detta händer.



  1. Använder flera PostgreSQL-scheman med Rails-modeller

  2. Hur får man nästa/föregående rekord i MySQL?

  3. Hur skickar man värden till IN-operatören dynamiskt?

  4. Architecting for Security:En guide för MySQL