Orada buna 3 yaklaşımlar temelde şunlardır: not exists, not inve left join / is null.
IS NULL ile LEFT JOIN
SELECT l.*
FROM t_left l
LEFT JOIN
t_right r
ON r.value = l.value
WHERE r.value IS NULL
DEĞİL
SELECT l.*
FROM t_left l
WHERE l.value NOT IN
(
SELECT value
FROM t_right r
)
MEVCUT DEĞİL
SELECT l.*
FROM t_left l
WHERE NOT EXISTS
(
SELECT NULL
FROM t_right r
WHERE r.value = l.value
)
Hangisi daha iyi? Bu sorunun cevabının belli başlı RDBMS satıcılarına ayrılması daha iyi olabilir. Genel olarak konuşursak, select ... where ... in (select...)alt sorgudaki kayıt sayısının büyüklüğü bilinmediğinde kullanmaktan kaçınılmalıdır . Bazı satıcılar boyutu sınırlayabilir. Örneğin Oracle, 1.000 sınırına sahiptir . Yapılacak en iyi şey, üçünü de denemek ve yürütme planını göstermektir.
Özellikle PostgreSQL oluşturur, yürütme planı NOT EXISTSve LEFT JOIN / IS NULLaynıdır. Ben kişisel olarak bu NOT EXISTSseçeneği tercih ediyorum çünkü niyeti daha iyi gösteriyor. Sonuçta anlambilim, A'da pk'sinin B'de bulunmadığı kayıtları bulmak istediğinizdir .
PostgreSQL'e özel eski ama yine de altın: https://explainextended.com/2009/09/16/not-in-vs-not-exists-vs-left-join-is-null-postgresql/