sql >> Database >  >> RDS >> Sqlserver

Waarschuwing krijgen:Null-waarde wordt geëlimineerd door een aggregatie of andere SET-bewerking

Meestal moet je er niets aan doen.

  • Het is mogelijk om de waarschuwing uit te schakelen door ansi_warnings in te stellen uit, maar dit heeft andere effecten, b.v. over hoe deling door nul wordt afgehandeld en fouten kan veroorzaken wanneer uw zoekopdrachten functies gebruiken zoals geïndexeerde weergaven, berekende kolommen of XML-methoden.
  • In een beperkt aantal gevallen kunt u het aggregaat herschrijven om het te vermijden. bijv. COUNT(nullable_column) kan worden herschreven als SUM(CASE WHEN nullable_column IS NULL THEN 0 ELSE 1 END) maar dit is niet altijd direct mogelijk zonder de semantiek te veranderen.

Het is slechts een informatief bericht dat vereist is in de SQL-standaard. Afgezien van het toevoegen van ongewenste ruis aan de berichtenstroom, heeft het geen nadelige gevolgen (behalve dat SQL Server het lezen van NULL niet zomaar kan omzeilen rijen, die een overhead kunnen hebben, maar het uitschakelen van de waarschuwing geeft in dit opzicht geen betere uitvoeringsplannen)

De reden voor het retourneren van dit bericht is dat tijdens de meeste bewerkingen in SQL nulls worden verspreid.

SELECT NULL + 3 + 7 retourneert NULL (met betrekking tot NULL als een onbekende hoeveelheid is dit logisch als ? + 3 + 7 is ook onbekend)

maar

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

Retourneert 10 en de waarschuwing dat nulls werden genegeerd.

Dit is echter precies de semantiek die u zoekt voor typische aggregatiequery's. Anders de aanwezigheid van een enkele NULL zou betekenen dat aggregaties op die kolom over alle rijen altijd resulteren in NULL wat niet erg handig is.

Wat is de zwaarste cake hieronder? (Afbeeldingsbron, Creative Commons-afbeelding gewijzigd (bijgesneden en geannoteerd) door mij)

Nadat de derde cake was gewogen, brak de weegschaal en dus is er geen informatie beschikbaar over de vierde, maar het was nog steeds mogelijk om de omtrek te meten.

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

De vraag

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

Retourneren

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

ook al is het technisch niet mogelijk om met zekerheid te zeggen dat 80 het gewicht was van de zwaarste cake (aangezien het onbekende aantal groter kan zijn), zijn de bovenstaande resultaten over het algemeen nuttiger dan het simpelweg retourneren van onbekend.

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

U wilt dus waarschijnlijk dat NULL's worden genegeerd, en de waarschuwing waarschuwt u alleen maar voor het feit dat dit gebeurt.



  1. Moet ik een inline varchar(max)-kolom gebruiken of deze in een aparte tabel opslaan?

  2. MariaDB DEFAULT() Uitgelegd

  3. Hoe de REGEXP_LIKE()-functie werkt in MySQL

  4. CASE-expressies gebruiken in SQL Server