2011-05-06 8 views
24

Tengo 2 tablas a continuación:filas de retorno, incluso si el registro no existe LEFT OUTER JOIN

Table_1 
[Group No] [Test No] [Description] 
123  1   [First Test] 
123  2   [Second Test] 
123  3   [Third Test] 

Table_2 
[Sample No] [Test No] [Result Description] 
ABC   1   [Some More Result] 
ABC   3   [Some Result] 
DEF   1   [A Result] 
DEF   2   [Results More] 
DEF   3   [Bad Results] 

Aquí está mi consulta: consulta

SELECT Table_1.[Group No], Table_1.[Test No], Table_1.Description, Table_2.[Result Description] 
FROM Table_1 
LEFT OUTER JOIN Table_2 ON Table_1.[Test No] = Table_2.[Test No] 
WHERE (Table_1.[Group No] = '123') AND (Table_2.[Sample No] = 'ABC') 

de djacobson:

SELECT Table_1.[Group No], Table_1.[Test No], Table_1.Description, Table_2.[Result Description] 
FROM Table_1 
LEFT OUTER JOIN Table_2 ON Table_1.[Test No] = Table_2.[Test No] 
WHERE (Table_1.[Group No] = '123') 
    AND (Table_2.[Sample No] IS NULL OR Table_2.[Sample No] = 'ABC') 

Esto devuelve :

[Group No] [Test No] [Description] [Result Description] 
123  1   [First Test] [Some More Result] 
123  3   [Third Test] [Some Result] 

Pero lo que realmente quiero es:

[Group No] [Test No] [Description] [Result Description] 
123  1   [First Test] [Some More Result] 
123  2   [Second Test] NULL 
123  3   [Third Test] [Some Result] 

es esto posible? Me gustaría devolver el registro con el Test No 2. Sin embargo, ¿cómo me uno a un registro que no existe? ¿O esto simplemente no es posible? ¿Cuáles son las alternativas?

Respuesta

42

A pesar de utilizar correctamente una combinación externa, está restringiendo el conjunto de resultados a los casos en que hay un valor en la Tabla_2 incluyendo una columna de esa tabla en su cláusula WHERE. Si desea que los registros en la muestra No. ABC es, o no hay registro en Table_2, lo que necesita hacer esto:

SELECT Table_1.[Group No], Table_1.[Test No], Table_1.Description, Table_2.[Result Description] 
FROM Table_1 
LEFT OUTER JOIN Table_2 ON Table_1.[Test No] = Table_2.[Test No] 
WHERE (Table_1.[Group No] = '123') 
    AND (Table_2.[Sample No] IS NULL OR Table_2.[Sample No] = 'ABC') 

Como alternativa, puede filtrar los resultados de Table_2 al unirse a ella (que, a su este caso, lee un poco más limpiamente):

SELECT Table_1.[Group No], Table_1.[Test No], Table_1.Description, Table_2.[Result Description] 
FROM Table_1 
LEFT OUTER JOIN Table_2 ON Table_1.[Test No] = Table_2.[Test No] AND Table_2.[Sample No] = 'ABC' 
WHERE (Table_1.[Group No] = '123') 

Eso debería lograr lo mismo. Lo importante aquí es que la cláusula WHERE filtra los resultados de unir sus tablas. Si está utilizando uniones externas pero desea filtrar en las tablas unidas externas, debe manejar el caso donde no exista registro en el otro extremo de la unión.

+0

Hola djacobson, esto todavía produce los mismos resultados, todavía no obtengo la fila con la Prueba nº 2. ¿Tiene algo que ver con la JOIN? – KayBee

+0

Eso es extraño ... ¿Exactamente qué consulta está utilizando ahora? Edite su pregunta para incluirla (puede usar el formato del código fuente en la pregunta, pero no en un comentario). –

+0

Hola, djacobson, la segunda consulta parece haber arrojado los resultados requeridos. He editado mi pregunta original, incluida la primera consulta que sugirió; esto no funcionó, pero el segundo sí lo hizo. – KayBee

Cuestiones relacionadas