8 Stimmen

Verknüpfung anderer Tabellen in Oracle-Baumabfragen

Bei einer einfachen (id, Beschreibung) Tabelle t1, wie

id  description
--  -----------
1   Alice
2   Bob
3   Carol
4   David
5   Erica
6   Fred

Und eine Eltern-Kind-Beziehung Tabelle t2, wie

parent  child
------  -----
1       2
1       3
4       5
5       6

Oracle bietet eine Möglichkeit, diese als Baum mit einigen benutzerdefinierten Syntaxerweiterungen zu durchlaufen:

select parent, child, sys_connect_by_path(child, '/') as "path"
from t2
connect by prior parent = child

Die genaue Syntax ist nicht wichtig, und ich habe wahrscheinlich einen Fehler in der obigen Darstellung gemacht. Das Wichtig ist, dass die obige Eingabe etwas ergibt, das wie folgt aussieht

parent  child  path
------  -----  ----
1       2      /1/2
1       3      /1/3
4       5      /4/5
4       6      /4/5/6
5       6      /5/6

Meine Frage ist dies: ist es möglich, eine andere Tabelle innerhalb der sys_connect_by_path(), wie die Tabelle t1 oben verbinden, um etwas wie zu produzieren:

parent  child  path
------  -----  ----
1       2      /Alice/Bob
1       3      /Alice/Carol
... and so on...

7voto

Mike McAllister Punkte 1439

Ersetzen Sie in Ihrer Abfrage T2 durch eine Unterabfrage, die T1 und T2 verknüpft und Elternteil, Kind und Kindbeschreibung zurückgibt. Verweisen Sie dann in der Funktion sys_connect_by_path auf die Child-Beschreibung aus Ihrer Unterabfrage.

6voto

dland Punkte 4124

Auf der Grundlage der Idee von Mike McAllister wird im Folgenden eine abgeleitete Tabelle verwendet, um das gewünschte Ergebnis zu erzielen:

select
     T.PARENT
    ,T.CHILD
    ,sys_connect_by_path(T.CDESC, '/')
from
    (
        select
             t2.parent      as PARENT
            ,t2.child       as CHILD
            ,t1.description as CDESC
        from
             t1, t2
        where
            t2.child = t1.id
    ) T
where
    level > 1 and connect_by_isleaf = 1
connect by prior
    T.CHILD = T.PARENT

In meinem Problem sind alle Elternteile unter einer "Super-Elternteil"-Wurzel verankert, was bedeutet, dass die Pfade vollständig mit SYS_CONNECT_BY_PATH beschrieben werden können, wodurch die Notwendigkeit für cagcowboys Technik der Verkettung des Elternteils mit dem Pfad entfällt.

0voto

cagcowboy Punkte 28493
SELECT parent, child, parents.description||sys_connect_by_path(childs.description, '/') AS "path"
FROM   T1 parents, T1 childs, T2
WHERE  T2.parent = parents.id
AND    T2.child = childs.id
CONNECT BY PRIOR parent = child

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