Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Uzyskiwanie ostrzeżenia:wartość Null jest eliminowana przez agregację lub inną operację SET

Przeważnie nie powinieneś nic z tym robić.

  • Możliwe jest wyłączenie ostrzeżenia poprzez ustawienie ansi_warnings wyłączone, ale ma to inne skutki, m.in. o tym, jak obsługiwane jest dzielenie przez zero i może powodować błędy, gdy Twoje zapytania używają funkcji, takich jak widoki indeksowane, kolumny obliczane lub metody XML.
  • W niektórych ograniczonych przypadkach możesz przepisać agregat, aby go uniknąć. np. COUNT(nullable_column) może być przepisany jako SUM(CASE WHEN nullable_column IS NULL THEN 0 ELSE 1 END) ale nie zawsze można to zrobić bezpośrednio bez zmiany semantyki.

To tylko komunikat informacyjny wymagany w standardzie SQL. Oprócz dodawania niechcianych szumów do strumienia wiadomości, nie ma to złych efektów (poza tym, że SQL Server nie może po prostu ominąć czytania NULL wierszy, które mogą mieć narzut, ale wyłączenie ostrzeżenia nie zapewnia lepszych planów wykonania w tym zakresie)

Powodem zwrócenia tego komunikatu jest to, że przez większość operacji w SQL rozprzestrzeniają się null.

SELECT NULL + 3 + 7 zwraca NULL (dotyczy NULL jako nieznana wielkość ma to sens jako ? + 3 + 7 jest również nieznany)

ale

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

Zwraca 10 i ostrzeżenie, że wartości null zostały zignorowane.

Jednak są to dokładnie semantyka, której potrzebujesz dla typowych zapytań agregujących. W przeciwnym razie obecność pojedynczego NULL oznaczałoby, że agregacje w tej kolumnie we wszystkich wierszach zawsze dałyby wynik NULL co nie jest zbyt przydatne.

Które ciasto jest najcięższe poniżej? (Źródło obrazu, obraz na licencji Creative Commons zmieniony (przycięty i opatrzony adnotacjami) przeze mnie)

Po zważeniu trzeciego ciasta waga pękła, więc nie ma informacji o czwartym, ale nadal można było zmierzyć obwód.

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

Zapytanie

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

Zwroty

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

chociaż technicznie nie można powiedzieć z całą pewnością, że 80 było wagą najcięższego ciasta (ponieważ nieznana liczba może być większa), powyższe wyniki są ogólnie bardziej przydatne niż po prostu zwracanie nieznanego.

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

Najprawdopodobniej chcesz, aby zignorowano wartości NULL, a ostrzeżenie po prostu informuje o tym, że tak się dzieje.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jaki jest najlepszy sposób wyświetlania obrazu z bazy danych serwera sql w asp.net?

  2. SQL Server:Przykłady danych ciągu PIVOTing

  3. Jak znaleźć procedurę składowaną zawierającą <tekst>?

  4. Czy klucze podstawowe są passé?

  5. Sposób na wyodrębnienie z danych wartości DateTime bez sekund