Esta es la solución más completa que te podemos brindar, pero obsérvala detenidamente y analiza si se puede adaptar a tu proyecto.
Solución:
Prueba esto
SELECT f.*
FROM first_table f LEFT JOIN second_table s ON f.key=s.key
WHERE s.key is NULL
Para obtener más información, lea este artículo: Uniones en Sql Server
Si está solicitando T-SQL, primero veamos los fundamentos. Aquí hay tres tipos de combinaciones, cada una con su propio conjunto de fases de procesamiento lógico como:
- A
cross join
es la más sencilla de todas. Implementa solo una fase de procesamiento de consultas lógicas, unaCartesian Product
. Esta fase opera en las dos tablas proporcionadas como entradas para la unión y produce un producto cartesiano de las dos. Es decir, cada fila de una entrada se compara con todas las filas de la otra. Entonces, si tiene m filas en una tabla y n filas en la otra, obtiene m × n filas en el resultado. - Entonces son
Inner joins
: Aplican dos fases de procesamiento de consultas lógicas:A Cartesian product
entre las dos tablas de entrada como en una unión cruzada, y luegofilters
filas basadas en un predicado que especifique enON
cláusula (también conocida comoJoin condition
). -
Luego viene el tercer tipo de uniones,
Outer Joins
:en un
outer join
, marca una tabla comopreserved
tabla usando las palabras claveLEFT OUTER JOIN
,RIGHT OUTER JOIN
, oFULL OUTER JOIN
entre los nombres de las tablas. ElOUTER
la palabra clave esoptional
. ElLEFT
palabra clave significa que las filas de laleft table
se conservan; elRIGHT
palabra clave significa que las filas en elright table
se conservan; y elFULL
palabra clave significa que las filas enboth
elleft
yright
Se conservan tablas.La tercera fase de procesamiento de consultas lógicas de un
outer join
identifica las filas de la tabla conservada que no encontraron coincidencias en la otra tabla en función de laON
predicado. Esta fase agrega esas filas a la tabla de resultados producida por las dos primeras fases de la combinación y usaNULL
marcas como marcadores de posición para el attributes desde el lado no conservado de la unión en esas filas exteriores.
Ahora, si miramos la pregunta: para devolver registros de la tabla de la izquierda que no se encuentran en la tabla de la derecha, use Left outer join
y filtrar las filas con NULL
valores para el attributes desde el lado derecho de la unión.
También me gusta usar NOT EXISTS. Cuando se trata de rendimiento, si se indexa correctamente, debería funcionar igual que LEFT JOIN o mejor. Además, es más fácil de leer.
SELECT Column1
FROM TableA a
WHERE NOT EXISTS ( SELECT Column1
FROM Tableb b
WHERE a.Column1 = b.Column1
)
Sección de Reseñas y Valoraciones
Más adelante puedes encontrar las notas de otros programadores, tú además puedes dejar el tuyo si dominas el tema.