Нет, для стандарта ANSI SQL это не так, нет. Ну, это не совсем так. Вы можете сделать левые внешние соединения и вставить достаточно, чтобы покрыть вероятную максимальную глубину, но если вы не ограничите максимальную глубину и не включите столько соединений, это не всегда будет работать.
Если ваш набор строк достаточно мал (скажем, меньше 1000), просто извлеките их все, а затем выясните это. По всей вероятности, это будет быстрее, чем одиночный обход.
Вы можете пакетировать родительский обход. Есть запрос как:
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
и добавьте его к любому номеру, который вы хотите. Если последний найденный родитель не равен нулю, вы еще не находитесь на вершине дерева, поэтому повторите запрос еще раз. Таким образом, вы должны уменьшить его до 1-2 круговых поездок.
Кроме этого, вы можете посмотреть на способы кодирования этих данных в ID. Это не рекомендуется, но если вы ограничите, скажем, каждый узел 100 дочерними узлами, вы можете сказать, что у узла с идентификатором 10030711 есть путь 10 -> 03 -> 07 -> 11. У этого, конечно, есть другие проблемы (например, max ID длина) и, конечно, это взломать.
Стоит также отметить, что в SQL существует две основные модели иерархических данных. Списки смежности и вложенные множества. Ваш путь (который довольно распространен) - это набор смежности. Вложенные наборы не очень помогут в этой ситуации, и они сложны для выполнения вставок.