Вывод дерева при помощи рекурсивной функции, MS SQL
От: KaBoom Чехия  
Дата: 14.06.09 16:52
Оценка:
Имеется таблица с полями ID, ParentID, Name.

ParentID ссылается на ID родительской записи. Количество уровней дерева неограничено.
Может кто-нибудь набросать функцию, которая будет возвращать все дочерние ID, начиная с любой вершины? Буду очень благодарен.
Re: Вывод дерева при помощи рекурсивной функции, MS SQL
От: IB Австрия http://rsdn.ru
Дата: 14.06.09 17:07
Оценка:
Здравствуйте, 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 (там в примерах есть вывод иерархического списка)
Мы уже победили, просто это еще не так заметно...
Re: Вывод дерева при помощи рекурсивной функции, MS SQL
От: Lloyd Россия  
Дата: 14.06.09 20:06
Оценка:
Здравствуйте, KaBoom, Вы писали:

KB>ParentID ссылается на ID родительской записи. Количество уровней дерева неограничено.

KB>Может кто-нибудь набросать функцию, которая будет возвращать все дочерние ID, начиная с любой вершины? Буду очень благодарен.

Recursive Queries Using Common Table Expressions
Re: Вывод дерева при помощи рекурсивной функции, MS SQL
От: avpavlov  
Дата: 15.06.09 15:26
Оценка:
Здравствуйте, 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 дерева одновременно так не построить, потому что имя таблицы динамически не задать
Re[2]: Вывод дерева при помощи рекурсивной функции, MS SQL
От: avpavlov  
Дата: 15.06.09 15:28
Оценка:
Дерево такое


A
+-B
| +-D
|   +-E
|   +-F
+-C
Re[2]: Вывод дерева при помощи рекурсивной функции, MS SQL
От: avpavlov  
Дата: 15.06.09 15:30
Оценка:
Чёрт! надеюсь это окончательный вариант

   A
 B   C
D E
   F
Re[2]: Вывод дерева при помощи рекурсивной функции, MS SQL
От: _d_m_  
Дата: 16.06.09 02:38
Оценка:
Здравствуйте, avpavlov, Вы писали:

A>Совместимость — легко реализуется на АНСИ СКЛ


CTE — это стандарт SQL.
Re[3]: Вывод дерева при помощи рекурсивной функции, MS SQL
От: avpavlov  
Дата: 16.06.09 07:05
Оценка:
Здравствуйте, _d_m_, Вы писали:

___>Здравствуйте, avpavlov, Вы писали:


A>>Совместимость — легко реализуется на АНСИ СКЛ


___>CTE — это стандарт SQL.


Да, жалко что толку от этого мало, потому что не везде поддерживается.
Re[4]: Вывод дерева при помощи рекурсивной функции, MS SQL
От: _d_m_  
Дата: 17.06.09 00:32
Оценка:
Здравствуйте, avpavlov, Вы писали:

___>>CTE — это стандарт SQL.


A>Да, жалко что толку от этого мало, потому что не везде поддерживается.


Толку мало также от суперуниверсальных приложений, которым типа пофиг с какой СУБД работать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.