valores tipos suma subconsultas separar por ejemplos delimitada consultas comas cadena anidadas acumular acumulada sql-server left-join

sql-server - tipos - suma acumulada sql server 2008



Devuelve las filas incluso si el registro no existe. (1)

Tengo 2 tablas a continuación:

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:

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'')

La consulta 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 posible? Me gustaría devolver el registro con la Prueba No. 2. Sin embargo, ¿cómo puedo unirme a un registro que no existe? ¿O esto simplemente no es posible? ¿Cuáles son las alternativas?


A pesar de utilizar correctamente una combinación externa, está restringiendo el conjunto de resultados a los casos en que un valor está presente en la Tabla_2 al incluir una columna de esa tabla en su cláusula WHERE. Si desea registros donde el Nº de muestra es ABC, O no hay ningún registro en la Tabla_2, debe 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'')

Alternativamente, puede filtrar los resultados de la Tabla_2 al unirse a ella (que, en este caso, se 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 unirse a sus tablas. Si está utilizando combinaciones externas pero desea filtrar en las tablas unidas externas, debe manejar el caso en el que no existe ningún registro en el lado opuesto de la combinación.