Syleiman
12:48 05-10-2006 Деревья в SQL
Не буду сейчас рассказывать о представлении деревьев в 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 (особенно будет хорошо, в случае кластерного индекса).

Вот так.
Комментарии:
Гость
23:13 05-10-2006
спасибо
al-gali
Syleiman
11:06 06-10-2006
Да было бы за что! :)