sql - valores - ¿Cómo excluir filas que no se unen con otra tabla?
unir dos tablas sql server (6)
Tengo dos tablas, una tiene clave principal y otra como clave externa.
Quiero extraer datos de la tabla primaria, solo si la tabla secundaria no tiene una entrada que contenga su clave. Tipo de opuesto de una combinación interna simple, que devuelve solo filas que se unen mediante esa clave.
Esto fue útil para usar en COGNOS porque se permitió la creación de una instrucción SQL "No en" en Cognos, pero tardó demasiado tiempo en ejecutarse. Había codificado manualmente la tabla A para unirme a la tabla B en Cognos como A.key "no en" B.key, pero la consulta tardaba demasiado / no devolvía los resultados después de 5 minutos.
Para cualquier otra persona que esté buscando una solución "NO ENCENDIDA" en Cognos, esto es lo que hice. Cree una consulta que una las tablas A y B con una combinación IZQUIERDA en Cognos seleccionando el tipo de enlace: la tabla A.Key tiene valores de "0 a N" en la tabla B, luego agregó un filtro (corresponde a cláusulas Where) para: tabla B .Key es NULL.
Corrió rápido y como un encanto.
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
utilice una combinación a la izquierda "no existe":
SELECT p.*
FROM primary_table p LEFT JOIN second s ON p.ID = s.ID
WHERE s.ID IS NULL
SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL
Imagen completa de unirse
Desde aticle: http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx
SELECT
*
FROM
primarytable P
WHERE
NOT EXISTS (SELECT * FROM secondarytable S
WHERE
P.PKCol = S.FKCol)
Generalmente , (NOT) EXISTS
es una mejor opción que (NOT) IN
o (LEFT) JOIN
SELECT P.*
FROM primary_table P
LEFT JOIN secondary_table S on P.id = S.p_id
WHERE S.p_id IS NULL