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

NOT IN (subquery) menghasilkan baris nol

Jika b dapat dibatalkan, ini bukan bug. Masalahnya adalah SQL Server ternyata NOT IN menjadi serangkaian <> 1 AND <> 2 AND <> 3 dll. Jika Anda memiliki <> NULL , yang mengembalikan tidak diketahui, yang dalam hal ini berarti salah. Dalam skenario yang berbeda, ini dapat memenuhi syarat atau mendiskualifikasi SEMUA baris. Daripada LEFT JOIN pendekatan, Anda harus mengatakan:

FROM dbo.OuterTable AS t
WHERE NOT EXISTS (SELECT 1 FROM x WHERE b = t.a);

Berikut adalah demonstrasi singkatnya:

DECLARE @x TABLE(i INT);
INSERT @x VALUES(1),(2);

DECLARE @y TABLE(j INT);
INSERT @y VALUES(2),(NULL);

SELECT i FROM @x WHERE i NOT IN -- produces zero results
  (SELECT j FROM @y);

SELECT i FROM @x  AS x WHERE NOT EXISTS -- produces one result
  (SELECT 1 FROM @y WHERE j = x.i);

Untuk lebih banyak detail (dan metrik untuk membuktikan mengapa NOT EXISTS adalah alternatif terbaik):

http://www.sqlperformance.com /2012/12/t-sql-queries/left-anti-semi-join

Juga, silakan baca posting blog ini oleh Gail Shaw:

http://sqlinthewild. co.za/index.php/2010/02/18/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 int vs perbandingan nvarchar pada kinerja?

  2. Menyortir data untuk sumber PIVOT

  3. Buat Kolom Terhitung di SQL Server menggunakan T-SQL

  4. datetime vs datetimeoffset di SQL Server:Apa Bedanya?

  5. Cara Mengenkripsi Fungsi Buatan Pengguna di SQL Server