![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Уважаемые спецы! Помогите пожалуйста с рекурсивным запросом. [MSSQL]
hgreg © (2002-10-02 12:14:00)Есть таблица типа
ID (int)
Title (varchar)
ParentID (int) - ссылка на ID
То есть в таблице хранится дерево.
Нужно сделать запрос, на вход которого подается ID, а на выходе я получаю рекордсет со всеми детьми, внуками, правнуками и т.д.
Заранее благодарен.
Desdechado (2002-10-03 13:56:00) [1]2 Prooksius © (02.10.02 15:20)
в шестерке - да (как оказалось), а пару лет назад я читал хелп по ИБ5.5 - вот в памяти и задержалось. А может быть это был даже информикс, тогда с ним тоже работал.
короче, оффтопик явный :)
Prooksius (2002-10-03 11:05:00) [2]2 SergSuper (03.10.02 11:03)
Это у нас маленький оффтопик - про Interbase вам рассказали :)
SergSuper (2002-10-03 11:03:00) [3]>Prooksius & Desdechado
Вобще-то в MS SQL рекурсия ограничена 32 вызовами. Но в решении, которое привёл Delirium, они всё равно не нужны.
>vuk
Хоть и MS рекомендует везде где это возможно использовать таблицы-переменные, на практике ускорения от их использования не получается. Во всяком случае я не обнаружил. Иногда даже медленне немного.
Т.е. использовать их надо, но ждать что оно будет быстрее работать не стоит.
vuk (2002-10-02 16:06:00) [4]Добавлю немного к тому, что писал Delirium.
Если используете MSSQL 2000, можно развертку делать в таблицу-переменную. Оно быстрее будет.
Prooksius (2002-10-02 15:20:00) [5]Цитирую Data Definition Guide:
Note Stored procedures can be nested up to 1,000 levels deep. This limitation helps to prevent infinite loops that can occur when a recursive procedure provides no absolute terminating condition. Nested procedure calls can be restricted to fewer than 1,000 levels by memory and stack limitations of the server.
По-русски - до 1000 вложений.
Desdechado (2002-10-02 14:52:00) [6]рекурсия в IB, например, ограничена (точно не помню, по-моему 16)
hgreg (2002-10-02 13:56:00) [7]Огромное спасибо - пришлось кое что поправить - но все получилось :)
Delirium (2002-10-02 13:02:00) [8]Развёртка простого дерева
set nocount on
select * into #tmp from test where id=3
while exists(select * from test
where (Parentid in (select id from #tmp))
and (id not in (select id from #tmp)))
insert #tmp select * from test
where (Parentid in (select id from #tmp))
and (id not in (select id from #tmp))
select * from #tmp
drop table #tmp
hgreg (2002-10-02 12:40:00) [9]Совершенно не критично - мне нужно чтоб оно работало :)
3JIA9I CyKA (2002-10-02 12:39:00) [10]Критично использовать рекурсию?
Prooksius (2002-10-02 12:15:00) [11]www.ibase.ru