Є в основному 3 підходи до того , що: not exists
, not in
і left join / is null
.
ЛІВО ПРИЄДНАЙТЕСЬ З НУЛЮ
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 має ліміт 1000 . Найкраще зробити це спробувати всі три та показати план виконання.
Конкретно формуйте PostgreSQL, план виконання NOT EXISTS
і LEFT JOIN / IS NULL
такі самі. Я особисто віддаю перевагу NOT EXISTS
варіанту, оскільки він краще показує наміри. В кінці кінців семантичний, що ви хочете , щоб знайти записи в тому , що його рк не існує в B .
Старе, але все-таки золото, характерне для PostgreSQL: https://explainextended.com/2009/09/16/not-in-vs-not-exists-vs-left-join-is-null-postgresql/