SELECT foreignStockId
FROM [Subset].[dbo].[Products]
Mungkin mengembalikan NULL .
Sebuah NOT IN kueri tidak akan mengembalikan baris apa pun jika ada NULL s ada dalam daftar NOT IN nilai-nilai. Anda dapat secara eksplisit mengecualikannya menggunakan IS NOT NULL seperti di bawah ini.
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)
Atau tulis ulang menggunakan NOT EXISTS sebagai gantinya.
SELECT stock.idstock,
stock.descr
FROM [Inventory].[dbo].[Stock] stock
WHERE NOT EXISTS (SELECT *
FROM [Subset].[dbo].[Products] p
WHERE p.foreignstockid = stock.idstock)
Serta memiliki semantik yang Anda inginkan untuk rencana eksekusi NOT EXISTS seringkali lebih sederhana seperti yang terlihat di sini.
Alasan untuk perbedaan perilaku ini adalah karena tiga logika bernilai yang digunakan dalam SQL. Predikat dapat dievaluasi menjadi True , False , atau Unknown .
Sebuah WHERE klausa harus bernilai True agar baris dikembalikan tetapi ini tidak mungkin dengan NOT IN ketika NULL hadir seperti yang dijelaskan di bawah ini.
'A' NOT IN ('X','Y',NULL) setara dengan 'A' <> 'X' AND 'A' <> 'Y' AND 'A' <> NULL)
- 'A' <> 'X' =
True - 'A' <> 'Y' =
True - 'A' <> NULL =
Unknown
True AND True AND Unknown mengevaluasi ke Unknown per tabel kebenaran untuk tiga logika bernilai.
Tautan berikut memiliki beberapa diskusi tambahan tentang kinerja berbagai opsi.
- Haruskah saya menggunakan
NOT IN,OUTER APPLY,LEFT OUTER JOIN,EXCEPT, atauNOT EXISTS? NOT INvs.NOT EXISTSvs.LEFT JOIN / IS NULL:SQL ServerLeft outer joinvsNOT EXISTSNOT EXISTSvsNOT IN