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 IN
vs.NOT EXISTS
vs.LEFT JOIN / IS NULL
:SQL ServerLeft outer join
vsNOT EXISTS
NOT EXISTS
vsNOT IN