Tengo dos tablas, una tiene clave principal y la otra la tiene como clave externa.
Quiero extraer datos de la tabla principal, solo si la tabla secundaria no tiene una entrada que contenga su clave. Una especie de opuesto de una combinación interna simple, que devuelve solo filas que se unen mediante esa clave.
B.Key IS NULL
pero todavía somos comparablesA.Key = B.Key
?SELECT * FROM primarytable P WHERE NOT EXISTS (SELECT * FROM secondarytable S WHERE P.PKCol = S.FKCol)
Generalmente ,
(NOT) EXISTS
es una mejor opción entonces(NOT) IN
o(LEFT) JOIN
fuente
LEFT JOIN
supera el rendimientoNOT EXIST
use una combinación izquierda "no existe":
SELECT p.* FROM primary_table p LEFT JOIN second s ON p.ID = s.ID WHERE s.ID IS NULL
fuente
Otra solucion es:
SELECT * FROM TABLE1 WHERE id NOT IN (SELECT id FROM TABLE2)
fuente
SELECT P.* FROM primary_table P LEFT JOIN secondary_table S on P.id = S.p_id WHERE S.p_id IS NULL
fuente
P.key = S.key
y luego decimoswhere S.key IS NULL
, ¿eso no hace que P.key también sea nula?Si desea seleccionar las columnas de la Primera tabla "que también están presentes en la Segunda tabla, en este caso también puede usar
EXCEPT
. En este caso, los nombres de las columnas también pueden ser diferentes, pero el tipo de datos debe ser el mismo".Ejemplo:
select ID, FName from FirstTable EXCEPT select ID, SName from SecondTable
fuente
Esto fue útil para usar en COGNOS porque se permitió la creación de una instrucción SQL "Not in" en Cognos, pero tardó demasiado en ejecutarse. Había codificado manualmente la tabla A para unirla a la tabla B en Cognos como A.key "no en" B.key, pero la consulta tardaba demasiado / no devolvía resultados después de 5 minutos.
Para cualquiera que esté buscando una solución "NOT IN" en Cognos, esto es lo que hice. Cree una consulta que combine las tablas A y B con LEFT JOIN en Cognos seleccionando el tipo de enlace: tabla A. La clave tiene valores de "0 a N" en la tabla B, luego agregó un filtro (estos corresponden a las cláusulas Where) para: tabla B .La clave es NULL.
Corrió rápido y como un encanto.
fuente