Имеется таблица с полями ID, ParentID, Name.
ParentID ссылается на ID родительской записи. Количество уровней дерева неограничено.
Может кто-нибудь набросать функцию, которая будет возвращать все дочерние ID, начиная с любой вершины? Буду очень благодарен.
Здравствуйте, KaBoom, Вы писали:
KB>Может кто-нибудь набросать функцию, которая будет возвращать все дочерние ID, начиная с любой вершины?
Классический варинат, который будет работать на любом сиквеле, начиная с 6.5
http://msdn.microsoft.com/en-us/library/aa172799(SQL.80).aspx
На рекурсивных запросах, будет работать начиная с 2005-й версии
http://msdn.microsoft.com/ru-ru/library/ms175972(SQL.90).aspx (там в примерах есть вывод иерархического списка)
Здравствуйте, KaBoom, Вы писали:
KB>ParentID ссылается на ID родительской записи. Количество уровней дерева неограничено.
KB>Может кто-нибудь набросать функцию, которая будет возвращать все дочерние ID, начиная с любой вершины? Буду очень благодарен.
Recursive Queries Using Common Table Expressions
Здравствуйте, KaBoom, Вы писали:
KB>Имеется таблица с полями ID, ParentID, Name.
KB>ParentID ссылается на ID родительской записи. Количество уровней дерева неограничено.
KB>Может кто-нибудь набросать функцию, которая будет возвращать все дочерние ID, начиная с любой вершины? Буду очень благодарен.
Если CTE\CONNECT BY не поддерживаются в твоей СУБД, я бы хранил в избыточном виде
Nodes (ID, Name)
Links (parentID, childID, level)
Дерево
A
B C
D E
F
Nodes
A,A
B,B
C,C
D,D
E,E
F,F
Links
A,B,1
B,D,1
A,D,2
B,E,1
A,E,2
A,C,1
E,F,1
B,F,2
A,F,3
Вставка — одним достаточно простым запросом
Чтение — одним простым запросом
Индексы — поддерживаются
Совместимость — легко реализуется на АНСИ СКЛ
У хранимой процедуры, что привёл IB есть серьёзные недостатоки
1) производительность
2) использовать в другиъ запросах не так просто. Временная таблица д.б. приготовлена заранее, кто-то я её должен чистить, 2 дерева одновременно так не построить, потому что имя таблицы динамически не задать
Дерево такое
A
+-B
| +-D
| +-E
| +-F
+-C
Чёрт! надеюсь это окончательный вариант
A
B C
D E
F