Joining andere Tabellen in Oracle-Baum-Abfragen
-
02-07-2019 - |
Frage
eine einfache (id, Beschreibung) Tabelle t1, wie
Angesichtsid 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
siehtparent 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...
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