Einzelnen Beitrag anzeigen

daddy

Registriert seit: 9. Sep 2005
Ort: Köln
126 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Rekursive Abfrage für Unterkategorien

  Alt 7. Jan 2010, 15:27
Habe gerade mal anhand eines kleinen Beispiels einen möglichen Lösungsansatz ausprobiert, der genutzt werden kann, wenn die Tiefe der Ebenen begrenzt ist (in meinem Beispiel auf 5) und wenn die Zahl der Kategorien einer Ebene begrenzt ist (in meinem Beispiel auf 99.999). Vielleicht hilft Dir dieser Ansatz ja weiter. Die Syntax bezieht sich übrigens auf Firebird, kann in MySQL also abweichen.

Gruß Daddy


Tabelle erstellen:
SQL-Code:
Create Table Kat
(ID Integer Not Null,
 Bez VarChar (30) Not Null,
 OberID Integer,
 Primary Key (ID));
Tabelle füllen:
ID.......Bez...............OberID
---------------------------------
1........Kat 0.............Null
2........Kat 0-1...........1
3........Kat 0-2...........1
4........Kat 0-1-1.........2
5........Kat 0-1-2.........2
6........Kat 0-1-1-1.......4
7........Kat 0-1-1-2.......4

Select-Befehl:
SQL-Code:
Select
Case When K3.OberID is NULL then
Case When K2.OberID is NULL then
Case When K1.OberID is NULL then
Case When K0.OberID is NULL then 'A'||Cast(K0.ID + 100000 as VarChar(6))
else 'A'||Cast(K1.ID + 100000 as VarChar(6))||'B'||Cast(K0.ID + 100000 as Var-Char(6)) End
else 'A'||Cast(K2.ID + 100000 as VarChar(6))||'B'||Cast(K1.ID + 100000 as Var-Char(6))||'C'||Cast(K0.ID + 100000 as VarChar(6)) End
else 'A'||Cast(K3.ID + 100000 as VarChar(6))||'B'||Cast(K2.ID + 100000 as Var-Char(6))||'C'||Cast(K1.ID + 100000 as VarChar(6))||'D'||Cast(K0.ID + 100000 as Var-Char(6)) End
else 'A'||Cast(K4.ID + 100000 as VarChar(6))||'B'||Cast(K3.ID + 100000 as Var-Char(6))||'C'||Cast(K2.ID + 100000 as VarChar(6))||'D'||Cast(K1.ID + 100000 as Var-Char(6))||'E'||Cast(K0.ID + 100000 as VarChar(6)) End as Sortierung,
Case When K4.OberID is NULL then
Case When K3.OberID is NULL then
Case When K2.OberID is NULL then
Case When K1.OberID is NULL then
Case When K0.OberID is NULL then 1
else 2 End
else 3 End
else 4 End
else 5 End
else 6 End as Ebene,
K0.ID, K0.Bez
from Kat K0
left join Kat K1 on K0.OberID = K1.ID
left join Kat K2 on K1.OberID = K2.ID
left join Kat K3 on K2.OberID = K3.ID
left join Kat K4 on K3.OberID = K4.ID
order by 1
Ergebnis des Selects:
Sortierung.........................Ebene...ID..... .Bez
--------------------------------------------------------------
A100001............................1.......1...... .Kat 0
A100001B100002.....................2.......2...... .Kat 0-1
A100001B100002C100004..............3.......4...... .Kat 0-1-1
A100001B100002C100004D100006.......4.......6...... .Kat 0-1-1-1
A100001B100002C100004D100007.......4.......7...... .Kat 0-1-1-2
A100001B100002C100005..............3.......5...... .Kat 0-1-2
A100001B100003.....................2.......3...... .Kat 0-2
  Mit Zitat antworten Zitat