Frage

eine einfache (id, Beschreibung) Tabelle t1, wie

Angesichts
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, dies mit einigen benutzerdefinierten Syntax-Erweiterungen wie ein Baum zu durchqueren:

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 dem oben gemacht. Das Wichtig ist, dass die oben etwas produzieren, das wie

sieht
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: ist es möglich, eine andere Tabelle in der sys_connect_by_path (), wie die t1 Tabelle oben zu verbinden, zu produzieren so etwas wie:

parent  child  path
------  -----  ----
1       2      /Alice/Bob
1       3      /Alice/Carol
... and so on...
War es hilfreich?

Lösung

In Ihrer Abfrage ersetzen T2 mit einer Unterabfrage, die T1 und T2 verbindet, und gibt Eltern, Kind und Kind Beschreibung. Dann in der sys_connect_by_path Funktion Bezug das Kind Beschreibung von Unterabfrage.

Andere Tipps

Auf der Grundlage von Mike McAllister Idee, verwendet die folgende eine abgeleitete Tabelle 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, alle Eltern unter einem „Super-Eltern“ root verankert, was bedeutet, dass die Wege voll mit SYS_CONNECT_BY_PATH beschrieben werden, wodurch die Notwendigkeit für cagcowboy Technik der die Eltern mit dem Pfad verketten.

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top