Не буду сейчас рассказывать о представлении деревьев в SQL, т.к. написано про это не просто много, а очень много (например, вот здесь
http://gsbelarus.com/gs/modules.php...article&sid=314)
Расскажу о решении задачи выбора излов произвольного поддерева.
Итак, у нас есть таблица, с древовидной структурой:
Id; ParentId; остальные поля.
В поле ParentId содержится ссылка на родительский элемент - пожалуй, самый распространённый способ представления дерева произвольной глубины в реляционной БД (если сущности в узлах различаются, то можно использовать дополнительные таблицы и связь 1-1).
Что делать в том случае, если вам по Id родителя надо выбрать все его дочерние элементы и дочерние дочерних и т.д. Самое простое - ввести дополнительное текстовое поле (NodeCode), в которое заносить информацию такого вида:
Id родителя1 | Id родителя2 | ... Id родителяN | Id элемента.
Где | - некий символ разделитель (может и не быть, в принципе)
Например (структура таблицы: Id; ParentId; NodeCode)
1; null; 1
2; 1; 1|2
3; 1; 1|3
4; 2; 1|2|4
5; 4; 1|2|4|5
Тогда выбор всех дочерних узлов для узла с Id=3 будет таким:
select * from Table where NodeCode like '1|3%'
Очень просто и быстро, с учётом того, что выражение like '1|3%' позволяет использовать индекс по полю NodeCode (особенно будет хорошо, в случае кластерного индекса).
Вот так.