Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Mendapatkan peringatan:Nilai nol dihilangkan dengan operasi SET agregat atau lainnya

Sebagian besar Anda seharusnya tidak melakukan apa-apa.

  • Dimungkinkan untuk menonaktifkan peringatan dengan menyetel ansi_warnings off tetapi ini memiliki efek lain, mis. tentang bagaimana pembagian dengan nol ditangani dan dapat menyebabkan kegagalan saat kueri Anda menggunakan fitur seperti tampilan yang diindeks, kolom yang dihitung, atau metode XML.
  • Dalam beberapa kasus terbatas, Anda dapat menulis ulang agregat untuk menghindarinya. misalnya COUNT(nullable_column) dapat ditulis ulang sebagai SUM(CASE WHEN nullable_column IS NULL THEN 0 ELSE 1 END) tetapi ini tidak selalu dapat dilakukan secara langsung tanpa mengubah semantik.

Ini hanya pesan informasi yang diperlukan dalam standar SQL. Selain menambahkan suara yang tidak diinginkan ke aliran pesan, itu tidak memiliki efek buruk (selain berarti bahwa SQL Server tidak bisa hanya melewati membaca NULL baris, yang dapat memiliki overhead tetapi menonaktifkan peringatan tidak memberikan rencana eksekusi yang lebih baik dalam hal ini)

Alasan untuk mengembalikan pesan ini adalah karena sebagian besar operasi di SQL nulls menyebar.

SELECT NULL + 3 + 7 mengembalikan NULL (tentang NULL sebagai kuantitas yang tidak diketahui ini masuk akal sebagai ? + 3 + 7 juga tidak diketahui)

tapi

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

Mengembalikan 10 dan peringatan bahwa nol diabaikan.

Namun ini adalah persis semantik yang Anda inginkan untuk kueri agregasi tipikal. Jika tidak, kehadiran satu NULL berarti agregasi pada kolom itu di semua baris akan selalu menghasilkan NULL yang tidak terlalu berguna.

Mana kue terberat di bawah ini? (Sumber Gambar, gambar Creative Commons diubah (dipotong dan diberi keterangan) oleh saya)

Setelah kue ketiga ditimbang timbangannya pecah sehingga tidak ada informasi yang tersedia tentang kue keempat tetapi masih mungkin untuk mengukur kelilingnya.

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

Kueri

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

Kembali

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

meskipun secara teknis tidak mungkin untuk mengatakan dengan pasti bahwa 80 adalah berat kue terberat (karena angka yang tidak diketahui mungkin lebih besar) hasil di atas umumnya lebih berguna daripada sekadar mengembalikan yang tidak diketahui.

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

Jadi kemungkinan besar Anda ingin NULL diabaikan, dan peringatan tersebut hanya mengingatkan Anda tentang fakta bahwa ini terjadi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. cara membuat data Anda horizontal

  2. Fungsi Partisi COUNT() OVER mungkin menggunakan DISTINCT

  3. Jenis teks SQL Server vs. tipe data varchar

  4. Java JDBC:tanggal secara konsisten dua hari libur

  5. Gunakan OBJECTPROPERTY() untuk Mengetahui apakah Tabel adalah Tabel Sistem di SQL Server