SQL NOT IN
Operator: Dijangka lwn. Sebenar
Pengendali NOT IN
dalam SQL sering memberikan cabaran. Artikel ini meneroka senario di mana kefungsian NOT IN
yang dijangkakan nampaknya gagal, menganalisis masalah dan menyediakan alternatif.
Andaikan terdapat dua pangkalan data, satu mengandungi inventori utama dan satu lagi mengandungi subset rekod ini. Pertanyaan menggunakan NOT IN
cuba mencari perbezaan antara dua pangkalan data ini:
<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>
Walau bagaimanapun, pertanyaan ini gagal memberikan hasil yang diharapkan. Ia mengecualikan semua rekod, walaupun ia wujud dalam pangkalan data subset. Kekurangan data menimbulkan persoalan: “Apa yang salah?”
Jawapannya terletak pada kemungkinan nilai NULL dalam pangkalan data subset. Apabila nilai NULL ditemui, pertanyaan NOT IN
akan dinilai kepada NULL, menyebabkan rekod tersebut dikecualikan. Tingkah laku ini berpunca daripada logik tiga nilai yang digunakan oleh SQL, di mana predikat boleh mengembalikan Benar, Salah atau Tidak Diketahui.
Untuk membetulkan masalah ini, dua alternatif boleh dipertimbangkan:
Gunakan 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>
Gunakan NOT EXISTS
dan bukannya NOT IN
:
<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>
Kedua-dua kaedah mengendalikan nilai NULL dengan cekap, memastikan hanya perbandingan yang sah dibuat. Pendekatan terakhir menggunakan NOT EXISTS
biasanya memberikan prestasi yang lebih baik dengan memudahkan pelan pelaksanaan.
Ingat, apabila berurusan dengan nilai NULL dalam SQL, sentiasa pertimbangkan logik tiga nilai dan gunakan teknik yang sesuai untuk mengelakkan keputusan yang tidak dijangka.
Atas ialah kandungan terperinci Mengapa Pertanyaan SQL `NOT IN` Saya Mengembalikan Keputusan Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!