de-vraag
  • Pertanyaan
  • Tag
  • Pengguna
Notifikasi
Imbalan
Registrasi
Setelah Anda mendaftar, Anda akan diberitahu tentang balasan dan komentar untuk pertanyaan Anda.
Gabung
Jika Anda sudah memiliki akun, masuk untuk memeriksa pemberitahuan baru.
Akan ada hadiah untuk pertanyaan, jawaban, dan komentar tambahan.
Lebih
Sumber
Sunting
Santiago Corredoira
Santiago Corredoira
Question

Pertanyaan kueri SQL: PILIH ... TIDAK DALAM

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

38 2008-11-17T16:54:09+00:00 3
 sblundy
sblundy
Pertanyaan edit 17 November 2008 в 5:03
Pemrograman
sql
sql-server
Pertanyaan ini memiliki :value jawaban dalam bahasa Inggris, untuk membacanya masuk ke akun Anda.
Solution / Answer
Amy B
Amy B
17 November 2008 в 4:58
2008-11-17T16:58:05+00:00
Lebih
Sumber
Sunting
#8638236
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)
  • Perbandingan terakhir itu dievaluasi menjadi null.
  • Null itu di-OR'd dengan ekspresi boolean lainnya, menghasilkan null. (*)
  • null dinegasikan, menghasilkan null.
  • null tidak benar - klausa di mana hanya menyimpan baris yang benar, jadi semua baris disaring.

(*) 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.

Amy B
Amy B
Jawaban edit 14 September 2015 в 8:13
65
0
 jerryhung
jerryhung
17 November 2008 в 5:09
2008-11-17T17:09:50+00:00
Lebih
Sumber
Sunting
#8638237

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
2
0
Kevin Fairchild
Kevin Fairchild
17 November 2008 в 5:19
2008-11-17T17:19:13+00:00
Lebih
Sumber
Sunting
#8638238
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]

Kevin Fairchild
Kevin Fairchild
Jawaban edit 17 November 2008 в 5:35
0
0
Tambahkan pertanyaan
Kategori
Semua
Teknologi
Budaya / Rekreasi
Kehidupan / Seni
Ilmu Pengetahuan
Profesional
Bisnis
Pengguna
Semua
Baru
Populer
1
Галина Утяшова
Terdaftar 20 jam yang lalu
2
Asilbek Qadamboyev
Terdaftar 3 hari yang lalu
3
Akshit Mehta
Terdaftar 6 hari yang lalu
4
me you
Terdaftar 1 minggu yang lalu
5
Никита иванов
Terdaftar 1 minggu yang lalu
ID
JA
KO
RU
© de-vraag 2022
Sumber
stackoverflow.com
di bawah lisensi cc by-sa 3.0 dengan atribusi