2010-07-12 14 views
14

estoy tratando de recuperar los dos conjuntos de información (las porciones rojas y azules del diagrama en la consulta.juntar tres mesas

pensé que podía hacerlo utilizando el SQL como se indica a continuación, pero no vuelve me nada cuando TableC no tiene ningún registro. Si TableC no tiene registros, yo todavía quiere esta consulta me devuelve los resultados según lo indicado por el área azul.

SELECT * FROM A. TableA Un

JOIN Tabla B B ON (A.id = B.a_id)

JOIN TableC C ON (A.id = C.a_id)

Apreciar cualquier punteros que me devuelva la segmentos de color rojo y/o azul. Gracias de antemano =]

Respuesta

15

intentar algo como esto

SELECT A.* FROM TableA A 
LEFT OUTER JOIN TableB B ON (A.id = B.a_id) 
LEFT OUTER JOIN TableC C ON (A.id = C.a_id) 
WHERE B.a_id IS NOT NULL 
    OR c.a_id IS NOT NULL 
+3

+1 - se ve bien para mí, además de que hay una falta de "ON" entre "Tab leC C "y" (A.id " –

9

Para entender por qué no conseguir ningún resultado cuando TableC no tiene ningún registro, tiene que aprender un poco sobre tipos de combinación en SQL.

Básicamente, cuando se emite la consulta

TableA A JOIN TableB B ON A.id = B.a_id 

usted está diciendo a la base de datos a la vista tanto TableA y TableB a buscar todos los pares de filas que satisfacen la predicado de combinación (A.id = B.a_id) Por lo tanto, si TableB está vacío, la base de datos no puede encontrar y par de filas con los criterios mencionados anteriormente.

Este tipo de JOIN se llama INNER JOIN y es el tipo más común de operación de unión utilizada.

En su caso que se desea obtener todas las filas de TableA X TableB y todos filas relevantes de TableC, si existen tales filas (basado en el predictate unirse a "A.id = C.a_id". Este es el caso para un OUTER JOIN. los dos tipos más comunes de este tipo de unión son el LEFT JOIN (que incluye todas las filas de la tabla izquierda) y el derecho join (que incluye todas las filas de la tabla derecha).

En este caso, su consulta debería ser:

SELECT A.* 
FROM 
    (TableA A JOIN Table B B ON A.id = B.a_id) 
    LEFT JOIN TableC C ON A.id = C.a_ID 

sugeriría a echar un vistazo a la página relevant Wikipedia, si usted quiere saber más acerca de los tipos de combinaciones en SQL

Editar

Siguiendo la misma lógica, si usted quiere tener todo filas de TableA y sólo las filas de las tablas pertinentes TableB y TableC (si existen), la consulta se convierten en:

SELECT A.* 
FROM 
    (TableA A LEFT JOIN Table B B ON A.id = B.a_id) 
    LEFT JOIN TableC C ON A.id = C.a_ID