2008-09-22 14 views
8

Bei einer einfachen (id, Beschreibung) Tabelle t1, wieJoining anderen Tabellen in Oracle Baum fragt

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

Und ein Eltern-Kind-Beziehung Tabelle t2, wie

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

Oracle Angebote 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 oben einen Fehler gemacht. Die Wichtig ist, dass die oben etwas zu produzieren, das

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 wie

aussieht: ist es möglich, eine andere Tabelle in der sys_connect_by_path(), wie die t1 Tabelle oben zu verbinden, so etwas wie zu produzieren :

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

Antwort

7

Ersetzen Sie in Ihrer Abfrage T2 durch eine Unterabfrage, die T1 und T2 verbindet, und gibt die Beschreibung für Eltern, Kind und Kind zurück. Dann referenzieren Sie in der Funktion sys_connect_by_path die untergeordnete Beschreibung von Ihrer Unterabfrage.

+0

Mit anderen Worten, verwenden Sie eine abgeleitete Tabelle. Na sicher! Guter Trick. – dland

0
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 
+0

Das funktioniert nicht ganz. Bei mehrstufigen Hierarchien ist der Pfad falsch. Zum Beispiel David/Fred/Erica statt David/Erica/Fred – dland

6

Basierend auf Mike McAllister Idee, die folgenden eine abgeleitete Tabelle verwendet 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 verankert sind unter einem "Super-Eltern" root, Dies bedeutet, dass die Pfade vollständig mit SYS_CONNECT_BY_PATH beschrieben werden können, wodurch die Notwendigkeit entfällt, dass cagcowboy die Eltern mit dem Pfad verkettet.

+1

Tolles Zeug, danke, dass du deine Lösung hier hochgestellt hast. Ich wünschte, mehr Leute würden das tun, es hilft der nächsten Person, die zu StackOverflow auf der Suche nach dieser Antwort kommt. –

+1

Gute Verwendung des Wortes umgehen! :-) – cagcowboy