2010-09-15 17 views
5

No estoy seguro de cómo describir mi estructura de la tabla, por lo que espero que esto tiene sentido ...Cómo hacer combinación externa en las Tablas 2> (Oracle)

Tengo 3 tablas de relación jerárquica de forma que A tiene una relación de uno a muchos con respecto a B, que a su vez tiene una relación de uno a muchos con C. El truco es que se permite que la clave externa en B y C sea nula (es decir, no se define ninguno de los padres). También tengo D y E sin relación con A, B o C (directamente).

Finalmente, tengo F que es una tabla de unión con muchas relaciones con C, D y E. Ninguno de sus campos (FK a las otras tablas) son nulables.

Me gustaría escribir una declaración SQL que una todas las tablas en un solo conjunto de resultados. Yo sé que tengo que une externa usuario porque quiero que todos regresaron Un independientemente de si tiene o no tiene hijos en B y similares con B y C.

Primera pregunta: He estado buscando en el exterior de combinación ANSI sintaxis (solo he usado Oracle "(+)" antes) y no puedo encontrar un ejemplo que el externo se una a más de 2 tablas. ¿Alguien puede proporcionar/señalar un ejemplo?

Pregunta Dos: ¿Es posible incluir registros de las tablas D y E en función de la tabla de unión F? Si es así, ¿se hace esto con uniones externas?

Gracias!

EDITAR

Por supuesto, justo después de publicar esto, me encontré con un ejemplo que responde a la pregunta 1. Sin embargo, la pregunta 2 todavía me ha dejado perplejos.

Ejemplo:

  SELECT A.a, 
       B.b, 
       C.c 
      FROM A 
FULL OUTER JOIN B ON B.a = A.a 
FULL OUTER JOIN C ON C.b = B.b 
+0

Probablemente no desee FULL OUTER JOIN; existe, pero rara vez se usa (o es útil). –

+0

No ha especificado qué columnas de F se unen a cada una de las otras tablas, lo que significa que nadie puede dar una respuesta definitiva. –

+0

¿Podría publicar algunos datos de muestra y el conjunto de registros que le gustaría obtener? A's, B's an's no son nombres muy informativos. – Quassnoi

Respuesta

0

Para aclaración, las letras mayúsculas se refieren a las tablas y las minúsculas a las columnas de clave principal/foránea. Probablemente debería haber escrito algo similar a Quassnoi, pero seguiré con esto ya que así fue como comenzó.

Esta SQL devuelve los resultados que estoy loooking para:

  SELECT A.a, 
       B.b, 
       C.c, 
       D.d, 
       E.e 
      FROM A 
FULL OUTER JOIN B ON B.a = A.a 
FULL OUTER JOIN C ON C.b = B.b 
FULL OUTER JOIN F ON F.c = C.c 
FULL OUTER JOIN D ON D.d = F.d 
FULL OUTER JOIN E ON E.e = F.e 

he intentado configurar mi SQL como el pico de pero utilizando COMPLETO une en lugar de que quedan, pero no respondió a los mismos resultados que mía. No puedo decir que entiendo completamente su SQL, pero las combinaciones INNER filtraron algunos de los resultados.

1
select a.*, b.*, c.* 
from a 
left outer join b on a.b_id = b.id 
left outer join c on a.c_id = c.id 

Ahora, consiguiendo D, E & F allí vuelve más complicado:

select c.*, d.*, e.* 
from C 
inner join f on c.id = f.c_id 
inner join d on d.id = f.d_id 
inner join e on d.id = f.e_id 

Luego ponerlo todo junto:

select a.*, b.*, cde.* 
from a 
left outer join b on a.b_id = b.id 
left outer join 
(select c.id as c_id, c.*, d.*, e.* 
    from C 
    inner join f on c.id = f.c_id 
    inner join d on d.id = f.d_id 
    inner join e on d.id = f.e_id) CDE 
on a.c_id = cde.c_id 
+0

Gracias! Debimos haber estado publicando al mismo tiempo. – sdoca

0
SELECT a.*, b.*, c.*, d.*, e.* 
FROM a 
LEFT JOIN 
     b 
ON  b.a = a.id 
LEFT JOIN 
     с 
ON  c.b = b.id 
LEFT JOIN 
     f 
ON  f.с = c.id 
LEFT JOIN 
     d 
ON  d.id = f.d 
LEFT JOIN 
     e 
ON  e.id = f.e 
9

Así visualizo el esquema de la siguiente manera:

A --o< B --o< C --<F>-- D 
         >-- E 

Por supuesto que puede hacer varias combinaciones, y también se puede unirse a grupo expresiones con paréntesis, al igual que puede agrupar expresiones aritméticas.

SELECT ... 
FROM A LEFT OUTER JOIN (
    B LEFT OUTER JOIN (
    C LEFT OUTER JOIN (
     F INNER JOIN D ON D.d = F.d 
     INNER JOIN E ON E.e = F.e 
    ) ON C.c = F.c 
    ) ON B.b = C.b 
) ON A.a = B.a 

Estos paréntesis son no subconsultas, que sólo están agrupando unirse a las operaciones.

+2

Esa es una gran manera de "dibujar" mi esquema. ¡Gracias! Necesito pasar algún tiempo averiguando si tu frase seleccionada hace lo que espero, pero creo que necesito usar FULL joins según mi comentario anterior para Jonathan. – sdoca

Cuestiones relacionadas