9 Stimmen

Outer Join auf >2 Tabellen (Oracle)

Ich bin mir nicht sicher, wie ich meine Tabellenstruktur beschreiben soll, also hoffe ich, dass dies Sinn macht...

Ich habe 3 Tabellen in hierarchischer Beziehung, so dass A eine Eins-zu-viele-Beziehung zu B hat, die wiederum eine Eins-zu-viele-Beziehung zu C hat. Der Trick ist, dass der Fremdschlüssel in B und C null sein darf (d. h. kein Elternteil definiert). Ich habe auch D und E, die keine Beziehung zu A, B oder C (direkt) haben.

Schließlich habe ich F, die eine Join-Tabelle mit vielen zu eins Beziehungen mit C, D und E ist. Keines ihrer Felder (FKs zu den anderen Tabellen) sind nullable.

Ich möchte eine SQL-Anweisung schreiben, die alle Tabellen in einer einzigen Ergebnismenge zusammenfasst. Ich weiß, dass ich Outer-Joins verwenden muss, weil ich möchte, dass alles von A zurückgegeben wird, unabhängig davon, ob es Kinder in B hat oder nicht, und ähnlich mit B und C.

Frage eins: Ich habe mir die ANSI-Syntax für die äußere Verknüpfung angesehen (ich habe bisher nur Oracle "(+)" verwendet) und kann kein Beispiel für eine äußere Verknüpfung von mehr als 2 Tabellen finden. Kann mir jemand ein Beispiel geben/zeigen?

Frage 2: Ist es möglich, Datensätze aus den Tabellen D und E auf der Grundlage der Verknüpfungstabelle F aufzunehmen? Wenn ja, wird dies mit Outer-Joins durchgeführt?

Danke!

EDIT

Natürlich habe ich gleich nach der Veröffentlichung dieses Artikels ein Beispiel gefunden, das Frage 1 beantwortet. Aber bei Frage 2 bin ich immer noch ratlos.

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

10voto

Bill Karwin Punkte 493880

Ich stelle mir Ihr Schema also so vor:

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

Sie können natürlich mehrere Verknüpfungen durchführen, und Sie können auch Verknüpfungsausdrücke mit Klammern gruppieren, genauso wie Sie arithmetische Ausdrücke gruppieren können.

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

Diese Klammern sind no Unterabfragen, sie sind nur gruppierende Join-Operationen.

2voto

sdoca Punkte 7632

Zur Verdeutlichung: Die Großbuchstaben beziehen sich auf Tabellen und die Kleinbuchstaben auf die Primär-/Fremdschlüsselspalten. Wahrscheinlich hätte ich es ähnlich wie Quassnoi schreiben sollen, aber ich werde es dabei belassen, da es so angefangen hat.

Diese SQL gibt die gesuchten Ergebnisse zurück:

         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

Ich habe versucht, mein SQL so einzurichten wie das von Bill, aber mit FULL-Joins anstelle von LEFT-Joins, aber es hat nicht die gleichen Ergebnisse wie meins geliefert. Ich kann nicht sagen, dass ich seine SQL vollständig verstehe, aber die INNER-Joins filterten einige der Ergebnisse.

1voto

James Curran Punkte 98228
 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

Schwieriger ist es, D, E und F hineinzubekommen:

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

Dann haben wir alles zusammengefügt:

 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

0voto

Quassnoi Punkte 396418
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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X