Tengo dos tablas con clave primaria vinculante en la base de datos y deseo encontrar un conjunto disjunto entre ellas. Por ejemplo,
Table1
tiene columnas (ID, Name
) y datos de muestra:(1 ,John), (2, Peter), (3, Mary)
Table2
tiene columnas (ID, Address
) y datos de muestra:(1, address2), (2, address2)
Entonces, ¿cómo creo una consulta SQL para poder obtener la fila con el ID table1
que no está en table2
. En este caso, (3, Mary)
¿debe devolverse?
PD. El ID es la clave principal para esas dos tablas.
Gracias por adelantado.
sql
database
postgresql
johnklee
fuente
fuente
Respuestas:
Prueba esto
fuente
Utilizar
LEFT JOIN
fuente
Hay básicamente 3: enfoques para que
not exists
,not in
yleft join / is null
.LEFT JOIN con IS NULL
NO EN
NO EXISTE
¿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
yLEFT JOIN / IS NULL
son lo mismo. Personalmente prefiero laNOT 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/
fuente
Alternativa rápida
Ejecuté algunas pruebas (en postgres 9.5) usando dos tablas con ~ 2M filas cada una. Esta consulta a continuación funcionó al menos 5 * mejor que las otras consultas propuestas:
fuente
Teniendo en cuenta los puntos señalados en el comentario / enlace de @John Woo anterior, así es como lo manejaría normalmente:
fuente
fuente