Rekursive Auflösung mit connect by

complain

Neuer Benutzer
Beiträge
3
Hallo.
Kurze Vorstellung:
Mein Name ist Georg, bin 24 und DBA sowie DB Anwendungsentwickler bei einem Transportunternehmen in Österreich.

Bin gerade dabei mich mit Oracle vertraut zu machen da ich eig. aus der MSSQL Welt komme.

Mein Problem derzeit erstreckt sich über hierachische Auflösung mittels connect by.
In die Syntax habe ich mich schon eingelesen und ich bekomm auch schon eine Hierachische Abstufung zusammen.
Leider nicht so wie ich es benötige:

z.B. wird mir die komplette Hierachy in einzelne Zeilen dargestellt:

/SL004​
/SL004/KD000N​
/SL004/KD000N/GB0002​
/SL004/KD000N/GB0002/AB0002​

Ich benötige aber nur die letzte Zeile:

/SL004/KD000N/GB0002/AB0002​

Und desweiteren wird mir der letzte Wert (Child) gar nicht mitausgegeben.
Die Abfrage sieht momentan so aus:
select sys_connect_by_path(MASTER_ID, '/')
from meinetabelle
connect by prior CHILD_ID = MASTER_ID
start with MASTER_HIERACHY_LEVEL = 10

Jemand ne Idee??

Danke im Voraus,
LGeorg
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.409
Leider kenne ich Oracle nicht, habe mich aber mal bei MSSQL mit Hirachie befasst. Dort gibt es einige neue Funktionen diesbezüglich, die aber in meinem Fall entweder schwer verständlich oder nicht hilfreich waren.

Es gab aber in dem MSDN Artikel dazu ( http://msdn.microsoft.com/de-de/magazine/cc794278.aspx ) interessanten Code. Mit dem T-SQL Code zu Abbildung 5 habe ich mir dann eine Sicht gebaut aus der ich den Pfad auslese, k.a. ob dir das weiter hilft :-/
 

complain

Neuer Benutzer
Beiträge
3
Danke für die rasche Antwort.

In MSSQL hab ich die Hierachy schon zusammengebaut.
Und ich hab mir halt in meiner Naivität gedacht, dass es auf Oracle wohl auch so gehen würde :D

Leider war dem nicht so.
 

ukulele

Datenbank-Guru
Beiträge
4.409
Dann weiss ich ja, wen ich fragen kann wenn mein Flickwerk mal den Geist aufgibt :) Aber ich fürchte bei Oracle spezifischen Problemen können dir nur wenig Leute hier helfen...
 

PLSQL_SQL

Datenbank-Guru
Beiträge
176
Hy,

wenn ich dich richtig verstanden habe, sollte folgendes helfen. Ich kann es leider im moment nicht ausprobieren, da ich keinen DB-Zugriff habe.

hier ein Beispiel aus der Oracle DOKU:

---------------------------------------------------------------------------------------------------------------------------------------------------------------
The following example returns the path of employee names from employee Kochhar to all employees of Kochhar (and their employees):
SELECT LPAD(' ', 2*level-1)||SYS_CONNECT_BY_PATH(last_name, '/') "Path"
FROM employees
START WITH last_name = 'Kochhar'
CONNECT BY PRIOR employee_id = manager_id;

Path
---------------------------------------------------------------
/Kochhar
/Kochhar/Greenberg
/Kochhar/Greenberg/Faviet
/Kochhar/Greenberg/Chen
/Kochhar/Greenberg/Sciarra
/Kochhar/Greenberg/Urman
/Kochhar/Greenberg/Popp
/Kochhar/Whalen
/Kochhar/Mavris
/Kochhar/Baer
/Kochhar/Higgins
/Kochhar/Higgins/Gietz
-------------------------------------------------------------------------------------------------------


Dein Beispiel:


select sys_connect_by_path(MASTER_ID, '/'), level as hierachieebene
from meinetabelle
connect by prior CHILD_ID = MASTER_ID
start with MASTER_HIERACHY_LEVEL = 10


Anschließend von diesem Stmt nur jene Einträge ermitteln, dessen "Hierachieebene" die größte Zahl besitzt.
 
Werbung:

Distrilec

Datenbank-Guru
Beiträge
670
Hi,

probier mal:

select sys_connect_by_path(MASTER_ID, '/')
from meinetabelle
where connect_by_isleaf = 1
connect by prior CHILD_ID = MASTER_ID
start with MASTER_HIERACHY_LEVEL = 10

(Hab es nicht getestet, sollte aber funktionieren)
 
Oben