Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Avviso:il valore Null viene eliminato da un'operazione di aggregazione o altra operazione SET

Per lo più non dovresti fare nulla al riguardo.

  • È possibile disabilitare l'avviso impostando ansi_warnings spento ma questo ha altri effetti, ad es. su come viene gestita la divisione per zero e può causare errori quando le tue query utilizzano funzionalità come viste indicizzate, colonne calcolate o metodi XML.
  • In alcuni casi limitati puoi riscrivere l'aggregato per evitarlo. per esempio. COUNT(nullable_column) può essere riscritto come SUM(CASE WHEN nullable_column IS NULL THEN 0 ELSE 1 END) ma questo non è sempre possibile farlo direttamente senza cambiare la semantica.

È solo un messaggio informativo richiesto nello standard SQL. Oltre ad aggiungere rumore indesiderato al flusso di messaggi, non ha effetti negativi (a parte il significato che SQL Server non può semplicemente ignorare la lettura di NULL righe, che possono avere un sovraccarico ma disabilitando l'avviso non si ottengono migliori piani di esecuzione in questo senso)

Il motivo della restituzione di questo messaggio è che nella maggior parte delle operazioni in SQL i null si propagano.

SELECT NULL + 3 + 7 restituisce NULL (riguardo a NULL come incognita questo ha senso come ? + 3 + 7 è anche sconosciuto)

ma

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

Restituisce 10 e l'avviso che i valori null sono stati ignorati.

Tuttavia queste sono esattamente la semantica che desideri per le tipiche query di aggregazione. Altrimenti la presenza di un singolo NULL significherebbe che le aggregazioni su quella colonna su tutte le righe finirebbero sempre per produrre NULL che non è molto utile.

Qual ​​è la torta più pesante qui sotto? (Fonte immagine, immagine Creative Commons modificata (ritagliata e annotata) da me)

Dopo che la terza torta è stata pesata, la bilancia si è rotta e quindi non sono disponibili informazioni sulla quarta, ma è stato comunque possibile misurare la circonferenza.

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

La domanda

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

Resi

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

anche se tecnicamente non è possibile dire con certezza che 80 fosse il peso della torta più pesante (poiché il numero sconosciuto potrebbe essere maggiore), i risultati sopra sono generalmente più utili del semplice ritorno di sconosciuto.

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

Quindi è probabile che tu voglia ignorare i NULL e l'avviso ti avverte semplicemente del fatto che sta accadendo.