기본적으로 not exists
, not in
및 left join / is null
.
IS NULL을 사용한 LEFT JOIN
SELECT l.*
FROM t_left l
LEFT JOIN
t_right r
ON r.value = l.value
WHERE r.value IS NULL
안
SELECT l.*
FROM t_left l
WHERE l.value NOT IN
(
SELECT value
FROM t_right r
)
존재하지 않음
SELECT l.*
FROM t_left l
WHERE NOT EXISTS
(
SELECT NULL
FROM t_right r
WHERE r.value = l.value
)
어느 것이 더 낫습니까? 이 질문에 대한 대답은 주요 특정 RDBMS 공급 업체로 분류하는 것이 더 나을 수 있습니다. 일반적으로 select ... where ... in (select...)
하위 쿼리의 레코드 수 크기를 알 수없는 경우 사용을 피해야 합니다. 일부 공급 업체는 크기를 제한 할 수 있습니다. 예를 들어 Oracle의 제한은 1,000 입니다. 가장 좋은 방법은 세 가지를 모두 시도하고 실행 계획을 보여주는 것입니다.
구체적의 PostgreSQL의 실행 계획을 형성 NOT EXISTS
과 LEFT JOIN / IS NULL
동일하다. 나는 개인적으로 NOT EXISTS
더 나은 의도를 보여주기 때문에 옵션을 선호합니다 . 결국 의미론은 A에서 pk 가 B에 존재하지 않는 레코드를 찾으려는 것입니다 .
오래되었지만 여전히 금색이며 PostgreSQL에만 해당됩니다. https://explainextended.com/2009/09/16/not-in-vs-not-exists-vs-left-join-is-null-postgresql/