Gunakan EXISTS
ekspresi:
WHERE NOT EXISTS (
SELECT FROM votes v -- SELECT list can be empty
WHERE v.some_id = base_table.some_id
AND v.user_id = ?
)
Perbedaannya
... antara NOT EXISTS()
(Ⓔ) dan NOT IN()
(Ⓘ) ada dua:
-
Kinerja
umumnya lebih cepat. Itu berhenti memproses subquery segera setelah kecocokan pertama ditemukan. Panduan:
Subquery umumnya hanya akan dieksekusi cukup lama untuk menentukan apakah setidaknya satu baris dikembalikan, tidak sampai selesai.
juga dapat dioptimalkan oleh perencana kueri, tetapi pada tingkat yang lebih rendah karena
NULL
penanganan membuatnya lebih kompleks. -
Kebenaran
Jika salah satu nilai yang dihasilkan dalam ekspresi subquery adalah
NULL
, hasil dari adalahNULL
, sedangkan logika umum mengharapkanTRUE
- dan akan mengembalikanTRUE
. Panduan:Jika semua hasil per baris tidak sama atau nol, dengan setidaknya satu nol, maka hasil
NOT IN
adalah nol.
Intinya, (NOT) EXISTS
adalah pilihan yang lebih baik dalam banyak kasus.
Contoh
Kueri Anda dapat terlihat seperti ini:
SELECT *
FROM questions q
WHERE NOT EXISTS (
SELECT FROM votes v
WHERE v.question_id = q.id
AND v.user_id = ?
);
Jangan jangan bergabung ke votes
dalam kueri dasar. Itu akan membatalkan usaha.
Selain NOT EXISTS
dan NOT IN
ada opsi sintaks tambahan dengan LEFT JOIN / IS NULL
dan EXCEPT
. Lihat:
- Pilih baris yang tidak ada di tabel lain