Rumah >pangkalan data >tutorial mysql >Mengapa Pertanyaan SQL `NOT IN` Saya Gagal Apabila Nilai NULL Hadir?

Mengapa Pertanyaan SQL `NOT IN` Saya Gagal Apabila Nilai NULL Hadir?

DDD
DDDasal
2025-01-18 11:26:12819semak imbas

Why Do My SQL `NOT IN` Queries Fail When NULL Values Are Present?

Menyelesaikan masalah NOT IN Pertanyaan dan Nilai NULL

Apabila menanyakan pangkalan data untuk mencari rekod yang tiada dalam subset, menggunakan NOT IN boleh menghasilkan hasil kosong yang tidak dijangka. Ini selalunya berlaku apabila subkueri mengandungi nilai NULL.

Masalahnya: NOT IN dan NULL

Pertimbangkan pertanyaan SQL ini direka untuk mendapatkan semula rekod daripada [Inventory].[dbo].[Stock] yang tidak hadir dalam [Subset].[dbo].[Products]:

<code class="language-sql">SELECT stock.IdStock, stock.Descr
FROM   [Inventory].[dbo].[Stock] stock
WHERE  stock.IdStock NOT IN (SELECT foreignStockId
                            FROM   [Subset].[dbo].[Products])</code>

Jika foreignStockId mengandungi NULL, pertanyaan ini mungkin tidak mengembalikan baris, walaupun padanan wujud. Ini disebabkan oleh logik tiga nilai SQL; perbandingan dengan NULL menghasilkan UNKNOWN, mempengaruhi penilaian NOT IN.

Penyelesaian: Mengendalikan NULL

Dua penyelesaian berkesan mengelakkan isu ini:

  1. Menapis NULL daripada Subquery: Ubah suai subquery untuk mengecualikan NULL menggunakan IS NOT NULL:
<code class="language-sql">SELECT stock.IdStock, stock.Descr
FROM   [Inventory].[dbo].[Stock] stock
WHERE  stock.IdStock NOT IN (SELECT foreignStockId
                             FROM   [Subset].[dbo].[Products]
                             WHERE  foreignStockId IS NOT NULL)</code>
  1. Menggunakan NOT EXISTS: Gantikan NOT IN dengan NOT EXISTS untuk pendekatan yang berpotensi lebih cekap dan lebih jelas:
<code class="language-sql">SELECT stock.idstock, stock.descr
FROM   [Inventory].[dbo].[Stock] stock
WHERE  NOT EXISTS (SELECT *
                   FROM   [Subset].[dbo].[Products] p
                   WHERE  p.foreignstockid = stock.idstock)</code>

Prestasi:

NOT EXISTS selalunya menghasilkan rancangan pelaksanaan yang lebih mudah, yang berpotensi membawa kepada prestasi yang lebih baik, terutamanya apabila berurusan dengan NULL.

Bacaan Selanjutnya:

Untuk perbandingan yang lebih mendalam tentang pendekatan berbeza untuk masalah ini, termasuk LEFT JOIN dan alternatif lain, lihat sumber ini:

Atas ialah kandungan terperinci Mengapa Pertanyaan SQL `NOT IN` Saya Gagal Apabila Nilai NULL Hadir?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn