Saya mencoba menjalankan kueri ini:
SELECT mac, creation_date
FROM logs
WHERE logs_type_id=11
AND mac NOT IN (select consols.mac from consols)
Tapi saya tidak mendapatkan hasil. Saya mengujinya, dan saya tahu ada yang salah dengan sintaksnya. Di MySQL, kueri seperti itu berfungsi dengan sempurna. Saya telah menambahkan baris untuk memastikan bahwa ada baris mac
yang tidak ada di consols
tabel, tetapi tetap tidak memberikan hasil apa pun.
postgresql
subquery
garis skowron
sumber
sumber
consols.mac
kolomNULL
atauNOT NULL
?Jawaban:
Saat menggunakan NOT IN, Anda harus memastikan bahwa tidak ada nilai yang NULL:
SELECT mac, creation_date FROM logs WHERE logs_type_id=11 AND mac NOT IN ( SELECT mac FROM consols WHERE mac IS NOT NULL -- add this )
sumber
WHERE mac IS NOT NULL
klausa di subkueri tidak diperlukan, karenaIn(...)
selalu menghapus NULL (dan duplikat). Karena satu set tidak dapat berisi NULLsIS NOT NULL
. Yang bersarangSELECT
kembali beberapaNULLS
, dan itu tersandungIN(SELECT...)
.IS NOT NULL
penyebab ini berhasil.NULL
dalamNOT IN
klausa tidak berfungsi karena perbandingannyaNULL
tidak benar atau salah. sqlbadpractices.com/using-not-in-operator-with-null-valuesis not null
jika tidak ada subkueri jika tidak menghasilkan nilai yang cocok dan setidaknya satunull
nilai. Dari bagian 9.22 dari manual PostgreSQL saat ini (versi 10): "[…] jika tidak ada nilai di sisi kanan yang sama dan setidaknya satu baris di sisi kanan menghasilkan null, hasil dari konstruksi NOT IN akan menjadi null, tidak benar . "Saat menggunakan NOT IN, Anda juga harus mempertimbangkan NOT EXISTS, yang menangani kasus null secara diam-diam. Lihat juga Wiki PostgreSQL
SELECT mac, creation_date FROM logs lo WHERE logs_type_id=11 AND NOT EXISTS ( SELECT * FROM consols nx WHERE nx.mac = lo.mac );
sumber
NOT EXISTS
vs... NOT IN
Anda juga bisa menggunakan kondisi LEFT JOIN dan IS NULL:
SELECT mac, creation_date FROM logs LEFT JOIN consols ON logs.mac = consols.mac WHERE logs_type_id=11 AND consols.mac IS NULL;
Indeks pada kolom "mac" mungkin meningkatkan kinerja.
sumber