Pas avec SQL standard ANSI ce n'est pas, non. Eh bien, ce n'est pas strictement vrai. Vous pouvez faire des jointures externes à gauche et les mettre suffisamment pour couvrir la profondeur maximale probable, mais à moins de restreindre la profondeur maximale et d'inclure autant de jointures, cela ne fonctionnera pas toujours.
Si votre jeu de lignes est suffisamment petit (disons moins de 1000), récupérez-les toutes et trouvez-les. Ce sera plus rapide que les parcours de lecture unique selon toute vraisemblance.
Vous pouvez effectuer le lot de la traversée parente. Avoir une requête comme:
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
et l'étendre au nombre que vous voulez. Si le dernier parent récupéré n'est pas nul, vous n'êtes pas encore en haut de l'arbre, alors réexécutez la requête. De cette façon, vous devriez le réduire à 1-2 allers-retours. En plus de cela, vous pouvez chercher des moyens de coder ces données dans l'ID. Ce n'est pas recommandé mais si vous limitez, disons, chaque nœud à 100 enfants, vous pourriez dire que le nœud avec un ID 10030711 a un chemin de 10 -> 03 -> 07 -> 11. Cela a bien sûr d'autres problèmes (comme max ID longueur) et bien sûr, c'est hacky.
Il convient également de noter qu'il existe deux modèles de base pour les données hiérarchiques dans SQL. Listes d'adjacence et ensembles imbriqués. Votre chemin (qui est assez commun) est un ensemble d'adjacence. Les ensembles imbriqués ne seraient pas vraiment utiles avec cette situation et ils sont compliqués à faire des insertions sur.
Malheureusement est assez grande et est encore en croissance constante mon ensemble de lignes. –