Hallo,
ich habe in einer Tabelle die Daten einer Baumstruktur. Jeder Knoten ist ein Eintrag. Jeder Knoten weiß nur seinen direkten Vorgänger.
Jetzt möchte ich nach Knoten suchen, die unter einem bestimmten Vorgängerknoten zu finden sind. Jedoch nicht der direkte Vorgänger, sondern ein paar Stufen darüber. Mir fehlt im Moment etwas die Idee, wie sowas möglichst geschickt auf der gegebenen Datenstruktur realisiert werden kann.
Bin für jeden Tip dankbar
Gruß
Jodus
Hi!
Mal so ein Versuch auf die schnelle…hab kaum Zeit ;o))
select a.Knoten, b.Knoten, C.Knoten, d.knoten, e.knoten
from a knotentab, b knotentab, c kntoentab, d knotentab, e knotentab
where a.knoten = b.vorgänger and … and a.knoten = ‚hugo‘
Sollte allerdings auch rekursiv angegangen werden können, aber für solche Spielchen hab ich keine Zeit ;o)
Gruß
Bernd
P.S.: oder heisst das inner from Anweisung knotentab as a…bin etwas ausser Übung *gg
Hallo,
nochmal eine kleine Ergänzung zum obigen Problem:
Die Daten sind alle in einer Tabelle enthalten. Vereinfacht kann man sie sich dreispaltig vorstellen: id, parent_id, eintrag.
Die Datenbank ist MySQL.
Gruß
Jodus
Hallo,
indem Du bei jeden Knoten zusätzlich den Pfad mitspeicherst z.B. als
,…,
(wobei die Primary-Keys der Knoten keine Kommas enthalten). Deine gesuchte Knotenmenge läuft dann auf ein LIKE Statement hinaus.
Gruss
Enno
PS: Es gibt zwar Proposals bestimmte Formen rekursiver Definitionen in SQL zuzulassen aber in die Praxis dürfte das noch nicht vorgedrungen sein.
Die Baumstruktur ist zwar praktisch, aber für relationale Datenbanken und Standard SQL denkbar ungeeignet… Rekursion wäre nötig ist aber nicht möglich, durch Joinen mit der gleichen Tabelle könntest du ein paar Ebenen weit kommen, aber du weisst ja nicht auf welcher Ebene der Knoten ist…
auf gut deutsch: mit der Struktur die du hast geht das überhaupt nicht effizient… das mit dem Pfad abspeichern wie in der vorhergehenden Antwort wäre eine Möglichkeit, führt natürlich zu Schwierigkeiten beim „Umhängen“ von Knoten und anderen Operationen
Grüße
Bruno
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
ich habe die eintraege nummeriert.
1
1.1
1.1.1
1.2
1.3
damit kann man relativ einfach unterstrukturen raussuchen und umhaengen ist auch einfach, macht jeweils einen regexp.
hi!
unter oracle funktioniert das mit einem rekursiven select-stmt.:
select id,parent_id
from tabelle
start with id =
connect by prior parent_id = id
keine ahnung, ob und wie das in anderen sql-derivaten funktionert …
grüße,
tomh