Rumah > pangkalan data > tutorial mysql > Mengapa Pertanyaan SQL `NOT IN` Saya Tidak Mengembalikan Keputusan Apabila Nilai NULL Wujud dalam Subquery?

Mengapa Pertanyaan SQL `NOT IN` Saya Tidak Mengembalikan Keputusan Apabila Nilai NULL Wujud dalam Subquery?

Patricia Arquette
Lepaskan: 2025-01-18 11:32:10
asal
824 orang telah melayarinya

Why Does My SQL `NOT IN` Query Return No Results When NULL Values Exist in the Subquery?

Klausa NOT IN SQL dan Masalah Nilai NULL

Operator NOT IN dalam SQL direka bentuk untuk memilih baris dengan nilai lajur tidak ditemui dalam set nilai yang ditentukan. Walau bagaimanapun, pengendali ini berkelakuan di luar jangkaan apabila set perbandingan mengandungi nilai NULL. Artikel ini menerangkan tingkah laku ini dan menawarkan penyelesaian.

Masalahnya:

Pertimbangkan senario di mana anda cuba mencari produk dalam satu pangkalan data (Inventory) yang tidak terdapat dalam pangkalan data subset (Subset). Pendekatan biasa menggunakan NOT IN mungkin kelihatan seperti 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

Jika subkueri (SELECT foreignStockId FROM [Subset].[dbo].[Products]) mengembalikan sebarang nilai NULL, keseluruhan NOT IN keadaan menjadi tidak tentu, menghasilkan set hasil kosong—walaupun terdapat nilai IdStock dalam [Inventory].[dbo].[Stock] iaitu tidak hadir dalam [Subset].[dbo].[Products].

Mengapa Ini Berlaku:

SQL menggunakan logik tiga nilai: TRUE, FALSE dan UNKNOWN. Apabila membandingkan nilai dengan NULL, hasilnya sentiasa UNKNOWN. NOT IN pada asasnya menyemak sama ada nilai adalah FALSE untuk semua perbandingan. Memandangkan UNKNOWN bukan FALSE, mana-mana NULL dalam set hasil subkueri menjadikan keseluruhan keadaan NOT IN dinilai kepada set kosong.

Penyelesaian:

Untuk mengelakkan isu ini, gunakan salah satu kaedah berikut:

1. Kecualikan NULL secara eksplisit: Ubah suai subkueri untuk menapis nilai 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

2. Gunakan NOT EXISTS: Pendekatan ini biasanya lebih disukai kerana kejelasan dan kecekapannya:

<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

Klausa NOT EXISTS menyemak sama ada baris tiada wujud dalam subkueri yang sepadan dengan keadaan. Ia mengendalikan nilai NULL dengan betul tanpa memerlukan pengecualian yang jelas.

Dengan memahami interaksi antara nilai NULL dan operator NOT IN, anda boleh menulis pertanyaan SQL yang lebih mantap dan boleh dipercayai. Alternatif NOT EXISTS selalunya merupakan penyelesaian yang lebih bersih dan cekap apabila berhadapan dengan nilai NULL yang berpotensi dalam set perbandingan.

Atas ialah kandungan terperinci Mengapa Pertanyaan SQL `NOT IN` Saya Tidak Mengembalikan Keputusan Apabila Nilai NULL Wujud dalam Subquery?. 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