Pada dasarnya ada 3 pendekatan untuk itu: not exists, not indan left join / is null.
LEFT JOIN dengan IS NULL
SELECT l.*
FROM t_left l
LEFT JOIN
t_right r
ON r.value = l.value
WHERE r.value IS NULL
TIDAK MASUK
SELECT l.*
FROM t_left l
WHERE l.value NOT IN
(
SELECT value
FROM t_right r
)
TIDAK ADA
SELECT l.*
FROM t_left l
WHERE NOT EXISTS
(
SELECT NULL
FROM t_right r
WHERE r.value = l.value
)
Mana yang lebih baik? Jawaban atas pertanyaan ini mungkin lebih baik dipecah menjadi vendor RDBMS khusus utama. Secara umum, seseorang harus menghindari penggunaan select ... where ... in (select...)ketika besarnya jumlah record dalam sub-query tidak diketahui. Beberapa vendor mungkin membatasi ukurannya. Oracle, misalnya, memiliki batas 1.000 . Hal terbaik untuk dilakukan adalah mencoba ketiganya dan menunjukkan rencana eksekusi.
Secara khusus membentuk PostgreSQL, rencana pelaksanaan NOT EXISTSdan LEFT JOIN / IS NULLadalah sama. Saya pribadi lebih suka NOT EXISTSopsi karena menunjukkan maksud yang lebih baik. Setelah semua semantik adalah bahwa Anda ingin menemukan catatan A yang pk yang tidak ada di B .
Tua tapi masih emas, khusus untuk PostgreSQL: https://explainextended.com/2009/09/16/not-in-vs-not-exists-vs-left-join-is-null-postgresql/