PDA

View Full Version : Hierarchische Abfrage DB2 / ODBC



reinhard
14-07-04, 15:13
Hallo,

mit dieser Abfrage möchte ich eine Baumstruktur auswerten.

Tabelle = emaila01

Spalten =

evname enname
AAA BBB
AAA CCC
AAA DDD
CCC EEE
DDD EEE
DDD FFF
FFF GGG

sqlstring = "with temp (enname) as " _
& "(select distinct evname " _
& "from emaila01 " _
& "where evname = 'AAA' " _
& "union all " _
& "select c.enname" _
& "from emaila01 c, temp p " _
& "where p.enname = c.evname) " _
& "select distinct enname from temp"

Jedoch bekomme ich die Fehlermeldung
"Schlüsselwort UNION nicht erwartet"

Vielen Dank im voraus für eine Antwort.

Gruß

Reinhard
:confused:

Fuerchau
14-07-04, 15:19
Im WITH ist kein Fullselect erlaubt, UNION scheidet daher aus.
Die temporäre Tabelle ist wie eine VIEW zu sehen, in der (leider) auch kein UNION erlaubt ist.

Ausserdem kann man innerhalb der temporären Tabelle nicht auf sich selbst verweisen !

reinhard
14-07-04, 15:30
Hallo,

Danke für deine Antwort.

Diese Idee hatte ich aus dem DB2 SQL-Cookbook
von Graeme Birchall (Seite 213)

http://ourworld.compuserve.com/homepages/graeme_birchall/


Gruß

Reinhard

reinhard
16-07-04, 10:03
Hallo nochmals,

gibt des denn keine andere Funktion für die DB2/AS400.

Wie z.B. für Oracle mit "connect by prior / start with"


Vielen Dank im voraus für eine Antwort.

Gruß

Reinhard
:confused:

Fuerchau
16-07-04, 10:34
Unter folgender Adresse findest du alles, was DB2/400 kann oder auch nicht kann:
http://publib.boulder.ibm.com/iseries/v5r2/ic2924/info/rzahf/rzahfms1.htm

Aber deinen Select muss man nicht unbedingt verstehen ?!?

reinhard
16-07-04, 13:37
Hallo Fuerchau,

Hier nochmal ein Beispiel wie so etwas auf Oracle
ausgeführt wird.

select parent from tabelle
connect by child = prior parent
start with child = 104
Union
select child from tabelle
connect by prior child = parent
start with parent=104;


Gruß

Reinhard

Fuerchau
16-07-04, 14:31
Oracle hilft mir da nicht so viel da ich Oracle nicht kenne.
DB2/400 nutzt SQL99.

Was bedeutet denn "connect by " oder "start with " ?
Kann man das nicht ganz normal als Join auflösen ?

select parent, child
from tabelle p
join tabelle c on p.parent = c.child
where parent = 104
union
select child, parent
from tabelle c
join tabelle p on c.child = p.parent
where child = 104

reinhard
19-07-04, 07:12
Hallo Fuerchau,

hier die Antwort auf deine Frage.

Den Baum durchwandern
Die Richtung der Abfrage, sei es vom Vater zu Kind oder Kind zu Vater wird durch die
Position der Spalte CONNECT BY PRIOR bestimmt. Der Operator bezieht sich auf die
Vater-Zeile. Um Kinder einer Vater-Zeile zu finden, wertet der Oracle-Server den Ausdruck
PRIOR für die Vater-Zeile und die anderen Ausdrücke für jede Zeile in der Tabelle aus.
Zeilen, für die die Bedingung auf TRUE lautet, sind Kinder des Vaters.
Der Oracle-Server wählt Kinder immer durch Auswertung der Bedingung CONNECT BY
In Bezug auf eine aktuelle Vater-Zeile aus.
START WITH Spezifiziert die Bedingung, die erfüllt werden muß.

Quelle Oracle Education (Knowlege.Performance.Success)<O:p</O:p


Gruß

Reinhard