Saya ingin menjalankan kueri sederhana untuk memunculkan semua baris di Table1
mana nilai kolom utama tidak ada dalam kolom di tabel lain ( Table2
).
Saya mencoba menggunakan:
SELECT * FROM Table1 WHERE Table1.principal NOT IN Table2.principal
Ini bukannya melemparkan kesalahan sintaksis. Pencarian Google membawa saya ke forum di mana orang mengatakan bahwa MySQL tidak mendukung NOT IN
dan sesuatu yang sangat kompleks perlu digunakan. Apakah ini benar? Atau apakah saya membuat kesalahan yang mengerikan?
Jawaban:
Untuk menggunakan IN, Anda harus memiliki set, gunakan sintaks ini sebagai gantinya:
sumber
table2.principal
bisaNULL
. Dalam hal ituNOT IN
akan selalu kembaliFALSE
karenaNOT IN
diperlakukan sebagai<> ALL
, yang membandingkan semua baris dari subquery sepertiTable1.principal <> table2.principal
, yang gagal bila dibandingkan denganNULL
:Table1.principal <> NULL
tidak akan menghasilkanTRUE
. Untuk memperbaiki:NOT IN (SELECT principal FROM table2 WHERE principal IS NOT NULL)
.Opsi subquery sudah dijawab, tetapi perhatikan bahwa dalam banyak kasus a
LEFT JOIN
bisa menjadi cara yang lebih cepat untuk melakukan ini:Jika Anda ingin memeriksa beberapa tabel untuk memastikan tidak ada di salah satu tabel (seperti dalam komentar SRKR), Anda dapat menggunakan ini:
sumber
NOT IN
&LEFT JOIN
. +1 keduanyaTIDAK DI vs. TIDAK ADA vs. LEFT BERGABUNG / IS NULL di MySQL
[...]
[...]
[...]
(penekanan ditambahkan)
sumber
Sayangnya sepertinya ada masalah dengan penggunaan MySql dari klausa "TIDAK DALAM", pemotretan di bawah ini menunjukkan opsi sub-kueri yang memberikan hasil yang salah:
sumber
Hati-hati
NOT IN
bukan alias untuk<> ANY
, tetapi untuk<> ALL
!http://dev.mysql.com/doc/refman/5.0/id/any-in-some-subqueries.html
tidak bisa diganti oleh
Anda harus menggunakan
sumber