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
Lepaskan: 2025-01-18 11:41:17
asal
828 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan