Saya yakin membuat kesalahan konyol tetapi saya tidak tahu apa:
Di SQL Server 2005 saya mencoba memilih semua pelanggan kecuali mereka yang telah melakukan reservasi sebelum jam 2 pagi.
Ketika saya menjalankan kueri ini:
SELECT idCustomer FROM reservations
WHERE idCustomer NOT IN
(SELECT distinct idCustomer FROM reservations
WHERE DATEPART ( hour, insertDate) < 2)
Saya mendapatkan 0 hasil.
Tapi
SELECT idCustomer FROM reservations
mengembalikan 152.000 hasil dan bagian "NOT IN":
SELECT distinct idCustomer FROM reservations
WHERE DATEPART ( hour, insertDate) < 2
hanya mengembalikan 284 baris
SELECT distinct idCustomer FROM reservations
WHERE DATEPART ( hour, insertDate) < 2
and idCustomer is not null
Pastikan parameter daftar Anda tidak mengandung nilai null.
Berikut penjelasannya:
WHERE field1 NOT IN (1, 2, 3, null)
sama dengan:
WHERE NOT (field1 = 1 OR field1 = 2 OR field1 = 3 OR field1 = null)
(*) Edit: penjelasan ini cukup bagus, tapi saya ingin membahas satu hal untuk mencegah nit-picking di masa depan. (TRUE ATAU NULL) akan mengevaluasi ke TRUE. Ini relevan jika field1 = 3, misalnya. Nilai TRUE itu akan dinegasikan ke FALSE dan baris akan disaring.
Mengingat ini adalah SQL 2005, Anda juga dapat mencoba ini Ini mirip dengan perintah MINUS Oracle (kebalikan dari UNION)
Tapi saya juga menyarankan untuk menambahkan kolom DATEPART (jam, insertDate) untuk debug
SELECT idCustomer FROM reservations
EXCEPT
SELECT idCustomer FROM reservations WHERE DATEPART ( hour, insertDate) < 2
SELECT Reservations.idCustomer FROM Reservations (nolock)
LEFT OUTER JOIN @reservations ExcludedReservations (nolock) ON Reservations.idCustomer=ExcludedReservations.idCustomer AND DATEPART(hour, ExcludedReservations.insertDate) < 2
WHERE ExcludedReservations.idCustomer IS NULL AND Reservations.idCustomer IS NOT NULL
GROUP BY Reservations.idCustomer
[Pembaruan: Menambahkan kriteria tambahan untuk menangani idCustomer menjadi NULL, yang tampaknya merupakan masalah utama yang dimiliki poster asli]