Menyelesaikan masalah NOT IN
Klausa dan Nilai NULL SQL
Artikel ini menangani masalah biasa yang dihadapi apabila menggunakan klausa NOT IN
dalam pertanyaan SQL: set hasil yang tidak disangka-sangka disebabkan oleh nilai NULL. Senario ini melibatkan pemilihan rekod daripada jadual Stock
(dalam pangkalan data Inventory
) yang tidak terdapat dalam jadual Products
(dalam pangkalan data Subset
).
Klausa NOT IN
gagal berfungsi seperti yang diharapkan apabila lajur foreignStockId
dalam jadual Products
mengandungi nilai NULL. Kehadiran walaupun satu NULL dalam set hasil NOT IN
subquery menyebabkan keseluruhan pertanyaan tidak mengembalikan baris.
Penyelesaian:
Untuk membetulkan ini, kita perlu mengecualikan nilai NULL secara eksplisit. Dua pendekatan berkesan dibentangkan:
1. Menggunakan IS NOT NULL
:
Pendekatan ini menapis NULL daripada NOT IN
subquery:
<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>
2. Menggunakan NOT EXISTS
:
Klausa NOT EXISTS
menyediakan alternatif yang lebih cekap dan selalunya 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>
Memahami Masalah: Logik Tiga Nilai
SQL menggunakan logik tiga nilai: Benar, Salah dan Tidak Diketahui. Klausa WHERE
mesti menilai kepada Benar untuk satu baris disertakan dalam set hasil. Isu timbul kerana 'A' <> NULL
menilai kepada Unknown
. Apabila Unknown
hadir dalam perbandingan NOT IN
, keseluruhan ungkapan menjadi Unknown
, menghasilkan set hasil kosong.
Contoh Ilustrasi:
Pertimbangkan ini:
Predicate | True | False | Unknown |
---|---|---|---|
'A' NOT IN ('X','Y',NULL) |
True | True | Unknown |
Hasil Unknown
berpunca daripada perbandingan 'A' dengan NULL. Oleh itu, keseluruhan klausa WHERE
dinilai kepada Unknown
dan tiada baris dikembalikan.
Dengan menggunakan sama ada IS NOT NULL
atau NOT EXISTS
, kami memintas kekaburan ini dan memastikan pertanyaan mengembalikan hasil yang dimaksudkan. Pendekatan NOT EXISTS
selalunya diutamakan untuk prestasi yang dipertingkatkan dan kebolehbacaannya dalam senario sedemikian.
Atas ialah kandungan terperinci Mengapa Klausa `NOT IN` SQL Saya Tidak Berfungsi dengan Nilai NULL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!