Rumah >pangkalan data >tutorial mysql >Mengapa Pertanyaan SQL `NOT IN` Saya Mengembalikan Keputusan Tidak Dijangka?

Mengapa Pertanyaan SQL `NOT IN` Saya Mengembalikan Keputusan Tidak Dijangka?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-18 11:41:17831semak imbas

Why Does My SQL `NOT IN` Query Return Unexpected Results?

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!

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