Hay básicamente 3: enfoques para que not exists
, not in
y left join / is null
.
LEFT JOIN con IS NULL
SELECT l.*
FROM t_left l
LEFT JOIN
t_right r
ON r.value = l.value
WHERE r.value IS NULL
NO EN
SELECT l.*
FROM t_left l
WHERE l.value NOT IN
(
SELECT value
FROM t_right r
)
NO EXISTE
SELECT l.*
FROM t_left l
WHERE NOT EXISTS
(
SELECT NULL
FROM t_right r
WHERE r.value = l.value
)
¿Cuál es mejor? La respuesta a esta pregunta podría ser mejor dividirla en los principales proveedores de RDBMS específicos. En términos generales, se debe evitar el uso select ... where ... in (select...)
cuando se desconoce la magnitud del número de registros en la subconsulta. Algunos proveedores pueden limitar el tamaño. Oracle, por ejemplo, tiene un límite de 1000 . Lo mejor que puede hacer es probar los tres y mostrar el plan de ejecución.
Específicamente de PostgreSQL, plan de ejecución de NOT EXISTS
y LEFT JOIN / IS NULL
son lo mismo. Personalmente prefiero la NOT EXISTS
opción porque muestra mejor la intención. Después de toda la semántica es que usted quiere encontrar registros en A que sus pk no existen en B .
Sin embargo, antiguo pero aún dorado, específico de PostgreSQL: https://explainextended.com/2009/09/16/not-in-vs-not-exists-vs-left-join-is-null-postgresql/