2010-09-15 14 views
5

Non sono sicuro di come descrivere la mia struttura della tabella, quindi spero che questo ha un senso ...Come fare Outer Join su> 2 tavoli (Oracle)

Ho 3 tabelle in relazione gerarchica tale che A ha una relazione uno a molti con B che a sua volta ha una relazione uno a molti con C. Il trucco è che la chiave esterna in B e C può essere nullo (cioè nessun genitore definito). Ho anche D ed E senza relazione con A, B o C (direttamente).

Infine, ho F che è una tabella di join con molte relazioni uno con C, D ed E. Nessuno dei suoi campi (FK alle altre tabelle) sono annullabili.

Vorrei scrivere un'istruzione SQL che unisce tutte le tabelle in un unico set di risultati. So che devo esterno utente entra perché voglio tutto ad un restituito a prescindere se sia o non ha figli in B e simili con B e C.

Domanda uno: Sono stato a guardare al esterna ANSI join sintassi (ho usato solo Oracle "(+)" prima) e non riesco a trovare un esempio che outer unisce più di 2 tabelle. Qualcuno può fornire/indicare un esempio?

Domanda n .: È possibile includere record dalle tabelle D ed E in base alla tabella F join? Se è così, questo è fatto con join esterni?

Grazie!

EDIT

Naturalmente, subito dopo ho questo post, ho trovato un esempio che risponde alla domanda 1. Tuttavia, la domanda 2 ancora mi ha messo in difficoltà.

Esempio:

  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

Probabilmente non vuoi FULL OUTER JOIN; esiste, ma è usato molto di rado (o utile). –

+0

Non hai specificato quali colonne in F si uniscono a ciascuna delle altre tabelle, il che significa che nessuno può dare una risposta definitiva. –

+0

Potresti pubblicare alcuni dati di esempio e il recordset che vorresti ottenere? A, B's an C non sono nomi molto istruttivi. – Quassnoi

risposta

0

Per maggiore chiarezza, le lettere maiuscole si riferiscono alle tabelle e le lettere minuscole alle colonne chiave primaria/esterna. Probabilmente avrei dovuto scriverlo in modo simile a Quassnoi, ma continuerò con questo dato che è così che è iniziato.

Questa SQL restituisce i risultati che sto interessato di:

  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 

ho cercato di impostare il mio SQL come Bill ma usando PIENA si unisce al posto di quelli di sinistra, ma non ha restituito gli stessi risultati il mio. Non posso dire di comprendere appieno il suo SQL, ma i join INNER hanno filtrato alcuni dei risultati.

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 

Ora, ottenendo D, E & F in respinge più complicato:

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 

Poi abbiamo messo tutto insieme:

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

Grazie! Dobbiamo aver pubblicato allo stesso tempo. – 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

Così ho visualizzare il vostro schema come questo:

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

Si può certamente fare di più unisce, e si può anche aderire a gruppi espressioni con parentesi, proprio come è possibile espressioni aritmetiche di gruppo.

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 

Queste parentesi sono non sottointerrogazioni, sono solo il raggruppamento operazioni di join.

+2

È un ottimo modo per "disegnare" il mio schema. Grazie! Ho bisogno di dedicare un po 'di tempo a capire se la tua istruzione select fa quello che spero, ma penso di aver bisogno di usare FULL joins come da mio commento sopra a Jonathan. – sdoca