Обычный способ обработки деревьев, в дополнение к обычным столбцам KEY и PARENT, у вас также есть столбцы типа PATH, которые содержат строковое значение, содержащее ключи узлов, составляющих путь, от корень, вплоть до самого узла, ограниченный символом, который не может быть частью самого ключа.
Позвольте привести пример:
KEY PARENT PATH
1 - *1*
2 1 *1*2*
3 1 *1*3*
4 3 *1*3*4*
5 1 *1*5*
6 5 *1*5*6*
Это в основном используется с деревьями, которые не слишком сильно меняются, например, иерархии отделов или тому подобное.
Я знаю, что такая строка не совсем соответствует теориям нормализации, поскольку кажется, что она делает недействительными несколько правил (многоключевые, многозначные поля и т. Д.), Но она весьма полезна во многих сценариях, включая Вы просите.
В вашем случае вам просто нужно получить значение TREE для рассматриваемого узла, и в зависимости от того, что проще всего, либо подсчитать количество символов-разделителей, либо удалить их с помощью функции замены, и вычислить разницу в длинах. .
Вот SQL, чтобы дать вам приведенный выше список узлов с их глубиной:
select KEY, PARENT, LEN(PATH)-LEN(REPLACE(PATH, '*', ''))-1 as DEPTH
from NODES
Обратите внимание, что этот подход не требует какого-либо специального синтаксиса или поддержки ядром базы данных для рекурсивного SQL и очень хорошо подходит для индексации.