Rumah >pangkalan data >tutorial mysql >Mengapa Klausa `NOT IN` SQL Saya Gagal Mengembalikan Hasil Yang Dijangka?

Mengapa Klausa `NOT IN` SQL Saya Gagal Mengembalikan Hasil Yang Dijangka?

Barbara Streisand
Barbara Streisandasal
2025-01-18 11:36:09463semak imbas

Why Does My SQL `NOT IN` Clause Fail to Return Expected Results?

Menyelesaikan masalah NOT IN Klausa SQL: Mengapa Ia Mungkin Gagal dan Cara Membetulkannya

Klausa SQL NOT IN direka untuk memilih baris daripada satu jadual yang tidak wujud dalam jadual yang lain. Walau bagaimanapun, tingkah laku yang tidak dijangka boleh berlaku, terutamanya apabila berurusan dengan nilai NULL.

Mari kita analisa pertanyaan bermasalah 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>

Pertanyaan ini mungkin tidak mengembalikan hasil, walaupun apabila ia sepatutnya mengecualikan rekod tertentu.

Punca Punca: NULL Nilai

Masalahnya berpunca daripada nilai NULL dalam lajur foreignStockId jadual Products. Pengendali NOT IN SQL berkelakuan tidak dapat diramalkan dengan NULLs. Perbandingan yang melibatkan NULL sentiasa menghasilkan UNKNOWN, yang seterusnya mempengaruhi logik boolean keseluruhan klausa WHERE.

Penyelesaian Berkesan:

Berikut ialah dua cara yang boleh dipercayai untuk membetulkannya:

  1. Menapis Keluar NULLs: Ubah suai subquery untuk mengecualikan nilai NULL secara eksplisit:
<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>
  1. Menggunakan NOT EXISTS: Operator ini menyediakan alternatif yang lebih mantap dan selalunya lebih cekap:
<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>

NOT EXISTS terus menyemak ketiadaan baris yang sepadan, mengelakkan kerumitan NULL perbandingan.

Pengoptimuman Prestasi:

Walaupun kedua-dua penyelesaian adalah betul, prestasinya boleh berbeza-beza. NOT EXISTS secara amnya membawa kepada pelan pelaksanaan yang lebih ringkas dan berkemungkinan lebih pantas, terutamanya dengan set data yang besar. Walau bagaimanapun, jika lajur foreignStockId anda bebas daripada nilai NULL, NOT IN mungkin berprestasi lebih baik sedikit. Adalah lebih baik untuk menguji kedua-dua pendekatan dalam persekitaran khusus anda untuk menentukan penyelesaian yang optimum.

Atas ialah kandungan terperinci Mengapa Klausa `NOT IN` SQL Saya Gagal Mengembalikan Hasil Yang 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