2010-09-15 12 views
5

Nie jestem pewien, jak opisać moją strukturę tabeli, więc nadzieję, że to ma sens ...Jak zrobić Outer Dołącz na> 2 tabelach (Oracle)

mam 3 tabele w hierarchicznej relacji tak, że A ma jedna do wielu relacji z B, która z kolei ma jedną lub wiele relacji z C. Sztuczka polega na tym, że klucz obcy w B i C może mieć wartość zerową (tj. nie zdefiniowano rodzica). Mam również D i E bez żadnego związku z A, B lub C (bezpośrednio).

Wreszcie mam F, który jest tabelą złączeń z wieloma do jednego związkami z C, D i E. Żadne z jej pól (FK do innych tabel) nie są null.

Chciałbym napisać instrukcję SQL, która łączy wszystkie tabele w jednym zestawie wyników. Wiem, że muszę do zewnętrznego sprzężenia użytkownika, ponieważ chcę, aby wszystkie A wrócił, niezależnie od tego, czy ma dzieci w B i podobne z B i C.

Pytanie pierwsze: Patrzyłem na sprzężenie zewnętrzne ANSI składnia (wcześniej korzystałem tylko z Oracle "(+)") i nie mogę znaleźć przykładu, który łączy zewnętrzne więcej niż 2 tabele. Czy ktoś może podać/wskazać przykład?

Pytanie drugie: Czy można uwzględnić rekordy z tabel D i E na podstawie tabeli łączenia F? Jeśli tak, czy robi to z zewnętrznymi złączeniami?

Dzięki!

EDIT

Oczywiście, zaraz po tym, jak pisać to, znalazłem przykład, który odpowiada na pytanie 1. Jednak pytanie 2 nadal ma mnie zakłopotany.

Przykład:

  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

Prawdopodobnie nie chcesz, aby FULL OUTER JOIN był połączony; istnieje, ale jest bardzo rzadko używany (lub przydatny). –

+0

Nie określono, które kolumny w F łączą się z każdą z pozostałych tabel - co oznacza, że ​​nikt nie może udzielić jednoznacznej odpowiedzi. –

+0

Czy możesz przesłać niektóre przykładowe dane i zestaw rekordów, które chcesz pobrać? Litery A, B i C nie mają zbyt wielu informacji. – Quassnoi

Odpowiedz

0

W celu wyjaśnienia, wielkie litery odnoszą się do tabel i małych liter do kolumn klucza głównego/obcego. Prawdopodobnie powinienem był napisać to podobnie do Quassnoi, ale pozostanie przy tym, ponieważ tak to się zaczęło.

To SQL zwraca wyniki jestem loooking dla:

  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 

próbowałem skonfigurować moją SQL jak Bill, ale stosując PEŁNY dołącza zamiast jedynek w lewo, ale nie zwraca te same wyniki jak kopalnia. Nie mogę powiedzieć, że w pełni rozumiem jego kod SQL, ale połączenia INNER odfiltrowały niektóre wyniki.

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 

Teraz coraz D, E & F tam dostaje trudniejsze:

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 

Następnie kładziemy to wszystko razem:

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

Dzięki! Musieliśmy publikować w tym samym czasie. – 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

Więc wizualizację schematu tak:

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

Można oczywiście zrobić wielokrotne łączy, można również dołączyć grupa wyrażenia z nawiasami jak możesz wyrażeń arytmetycznych grupowych.

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 

te nawiasy są nie podzapytania, oni po prostu grupowania operacji łączenia.

+2

To świetny sposób na "narysowanie" mojego schematu. Dzięki! Muszę poświęcić trochę czasu na zastanowienie się, czy twoje oświadczenie wyboru robi to, co mam nadzieję, ale myślę, że potrzebuję użyć pełnych złączeń jak na mój komentarz powyżej do Jonathana. – sdoca