Rumah >pangkalan data >tutorial mysql >Mengapa Pertanyaan SQL `NOT IN` Saya Gagal Apabila Nilai NULL Hadir?
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:
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>
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!