2010-12-30 8 views
49

Tengo dos tablas, una tiene clave principal y otra como clave externa.¿Cómo se excluyen las filas que no se unen con otra tabla?

Quiero extraer datos de la tabla primaria, solo si la tabla secundaria no tiene tiene una entrada que contiene su clave. Tipo de opuesto de una combinación interna simple, que devuelve solo filas que se unen mediante esa clave.

Respuesta

164

alt text

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 alt text

De aticle: http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx

+9

Guau, esas imágenes aclaran las cosas. ¡Muy apreciado! – Chaddeus

+1

finalmente! ¿Por qué no tienen estos en libros de texto y por qué mis profesores en la universidad no tienen estos? usaron las peores explicaciones posibles en el mundo, ¡no remotamente cercanas a estas! – pythonian29033

+0

Esto es oro. No me gusta escribir un comentario que no tenga contenido sino efusivos elogios, ¡pero vamos! Esta es una respuesta increíble. Gracias, @Pranay Rana. – 0xbe5077ed

5
SELECT 
    * 
FROM 
    primarytable P 
WHERE 
    NOT EXISTS (SELECT * FROM secondarytable S 
    WHERE 
     P.PKCol = S.FKCol) 

general, (NOT) EXISTS es una mejor opción entonces (NOT) IN o (LEFT) JOIN

+0

bien, él no publicó lo que se usa DBRMS, sin embargo en MySql 'LEFT JOIN' supera' NOT EXIST' –

+0

@The Scrum Meister: ¿dije más rápido? Busque IN vs EXISTS vs JOIN para descubrir las diferencias semánticas y lógicas ... – gbn

+0

@gbn Lo siento, pensé que por "mejor opción" quería decir más rápido. ¿Puedes explicar por qué es una mejor opción? http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/ –

4

utilizar un "no existe" combinación izquierda:

SELECT p.* 
FROM primary_table p LEFT JOIN second s ON p.ID = s.ID 
WHERE s.ID IS NULL 
3
SELECT P.* 
FROM primary_table P 
LEFT JOIN secondary_table S on P.id = S.p_id 
WHERE S.p_id IS NULL 
+1

Tengo una pregunta ... si estamos utilizando la condición 'P.key = S.key' y luego decimos' donde S.key IS NULL', entonces ¿eso no hace que P.key null también? – Somjit

3

Si desea seleccionar las columnas de la primera tabla "que también están presentes en la segunda tabla, entonces 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 
0

Esto fue útil para usar en COGNOS porque se permitió la creación de una declaración SQL "No en" en Cognos, pero tardó demasiado 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.

Ran rápido y como un encanto.

Cuestiones relacionadas