> Если узел перемещается, то естественно уровень может меняться. В этом
> случае в триггере на обновление узла вызываем обновление всех его
> потомков в цикле, те в свою очередь сделают то же самое со своими
> потомками и т.д. Таким образом обходим рекурсию.

Это тоже рекурсия. В триггере на update вызываем update, который тоже
вызывает триггер, который в свою очередь... и т. д....

> Я тут уже замучился намекать на то, что условия задачи неполны. :)

Условия задачи полны: сказать мне, как называется константа, которая
ограничивает глубину рекурсивных вызовов процедур. ;))

Я замучаюсь объяснять всю задачу... Но, в частности, она сводится к
поиску расстояний до всех потомков от некоторого произвольно заданного
в момент запроса узла несбалансированного (местами сильные перекосы)
бинарного дерева. На выходе запроса должна получаться таблица, в
которой в соответствие каждому узлу ставится расстояние до заданного
родительского узла. Дерево изменяется узлы могут переставляться, в том
числе и те, которые близки к корню.

> Вычисление пути при вставке/обновлении узла также элементарно: берём
> префикс родителя, добавляем идентификатор вставляемого узла.

И нужно обновить идентификаторы всех его потомков...

> З.Ы. Эк меня зацепило. Это всё потому, что не люблю я рекурсию. Хотя
> готовить её умею. :)

Если бы писали на функциональных языках полюбили бы, многие задачи
решаются с её помощью гораздо проще. Только нужен умный компилятор,
который будет её раскручивать в цикл. ;) Я тоже не люблю рекурсию в
FB, но на данный момент это простое и  достаточно эффективное решение
имеющейся проблемы. До этого напоролся на ограничение глубины
рекурсии, переделал всё с помощью UDF год жили, но происходит утечка
памяти в селективных процедурах. Сейчас это стало проблемой, в 2.1 её
можно решить, но не хочется переписывать UDF. Кроме того, появился
вкусный WITH RECURSIVE. Вот я и хочу снова попробовать рекурсию,
только глубину надо увеличить. ;)

Ответить