Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

SQL TIDAK DI tidak berfungsi

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 , atau NOT EXISTS ?
  • NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL :SQL Server
  • Left outer join vs NOT EXISTS
  • NOT EXISTS vs NOT IN


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server 2005 Bagaimana Membuat Batasan Unik?

  2. Berbagai cara untuk menggunakan fungsi tanggal SQL CONVERT

  3. Nama file SQL Server vs versi

  4. Dapatkan Bahasa yang Saat Ini Digunakan di SQL Server

  5. PILIH UNTUK PEMBARUAN dengan SQL Server