Rumah >pangkalan data >tutorial mysql >Mengapa Klausa `NOT IN` SQL Saya Gagal Mengembalikan Hasil Yang Dijangka?
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 NULL
s. 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:
NULL
s: 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>
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!