Nicht mit ANSI-Standard SQL ist es nicht, nein. Nun, das stimmt nicht ganz. Sie können linke Outer-Joins ausführen und genug einbringen, um die wahrscheinliche maximale Tiefe abzudecken. Wenn Sie jedoch die maximale Tiefe nicht beschränken und so viele Joins einbeziehen, wird dies nicht immer funktionieren.
Wenn Ihre Reihe von Zeilen ausreichend klein ist (sagen Sie weniger als 1000), rufen Sie sie alle nur ab und dann herausfinden. Es wird aller Wahrscheinlichkeit nach schneller als Single-Read-Traversal sein.
Sie könnten die Parent Traversal parsen. Haben Sie eine Abfrage wie:
SELECT t1.id id1, t1.parent parent1,
t2.id id2, t2.parent parent2,
t3.id id3, t3.parent parent3,
t4.id id4, t4.parent parent4,
t5.id id5, t5.parent parent5
FROM mytable t1
LEFT OUTER JOIN mytable t2 ON t1.parent = t2.id
LEFT OUTER JOIN mytable t3 ON t2.parent = t3.id
LEFT OUTER JOIN mytable t4 ON t3.parent = t4.id
LEFT OUTER JOIN mytable t5 ON t4.parent = t5.id
WHERE t1.id = 1234
und erweitern Sie es auf welche Nummer Sie wollen. Wenn das zuletzt abgerufene übergeordnete Element nicht null ist, befinden Sie sich noch nicht an der Spitze der Struktur. Führen Sie die Abfrage daher erneut aus. Auf diese Weise sollten Sie es hoffentlich auf 1-2 Runden reduzieren.
Darüber hinaus könnten Sie Möglichkeiten zur Codierung dieser Daten in der ID suchen. Dies wird nicht empfohlen, aber wenn Sie beispielsweise jeden Knoten auf 100 Kinder beschränken, können Sie sagen, dass der Knoten mit der ID 10030711 den Pfad 10 -> 03 -> 07 -> 11 hat. Das hat natürlich andere Probleme (wie max ID Länge) und natürlich ist es hacky.
Es ist auch erwähnenswert, dass es zwei grundlegende Modelle für hierarchische Daten in SQL gibt. Adjazenzlisten und verschachtelte Sets. Dein Weg (der ziemlich häufig ist) ist ein Adjacency-Set. Verschachtelte Mengen würden in dieser Situation nicht wirklich helfen und sie sind kompliziert, um Einfügungen auszuführen.
Leider ist mein Satz von Zeilen recht groß ist und wird auch ständig wächst. –