powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / дерево и SQl
5 сообщений из 5, страница 1 из 1
дерево и SQl
    #37741572
Андрей Васильевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня!
Возникла задача создать дерево. Все просто, но для примера упрощу, таблица Tabl, первичный ключ ID_T и вторичный ID_T_T который ссылается на первичный. Для корня ID_T_T равен null.
Сейчас задача состоит в том, что я буду знать узел(значение ID_T) и мне нужно будет узнать путь к корю, то есть все ID_T до конечного где ID_T_T будет равен нулю. Можно конечно в цикле запросами пока не появится ID_T_T is null, но уж больно хочется рекурсии. Не посчастливилось мне с ней встретиться на SQL(например на с++ это очень просто).
Пока предполагаю решение в виде процедуры которая будет вызывать саму себя. Но можно ли это сделать просто в виде запроса SQL?
...
Рейтинг: 0 / 0
дерево и SQl
    #37741764
kospos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрей Васильевич,
у меня вот так получилось:

create table TEST_REC(id_t int, id_t_t int)

insert into TEST_REC values (0,null),(1,null),(3,0),(4,1),(2,0),(6,3),(5,4),(7,6)

WITH temp(level, path, id, id1)
AS (SELECT 1, CAST('/' AS VARCHAR(10)) PATH, id_t, id_t_t
FROM TEST_REC
WHERE id_t_t IS NULL
UNION ALL
SELECT level + 1, path || id || '/', id_t, id_t_t
FROM temp t, test_rec r
WHERE t.id = r.id_t_t AND level < 100000)
SELECT PATH FROM temp where id= <Ваше значение id_t>
...
Рейтинг: 0 / 0
дерево и SQl
    #37741892
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kospos,

Для производительности тут всё же начинать с <значение ID_T>, а не с корня:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
with t (id_t, id_t_t) as (values 
  (0, null)
, (1, null)
, (3, 0)
, (4, 1)
, (2, 0)
, (6, 3)
, (5, 4)
, (7, 6)
)
, a (lvl, id, path) as (
values (1, <значение ID_T>, cast(rtrim(char(<значение ID_T>)) as varchar(20)))
  union all
select lvl+1, t.id_t_t, path||'-'||rtrim(char(t.id_t_t))
from a, t
where t.id_t=a.id and t.id_t_t is not null
)
select id, lvl, path
from a
order by lvl
...
Рейтинг: 0 / 0
дерево и SQl
    #37743482
CawaSPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Васильевич,

http://mysite.verizon.net/Graeme_Birchall/cookbook/DB2V97CK.PDF
Стр. 309 - 332.
...
Рейтинг: 0 / 0
дерево и SQl
    #37747875
Андрей Васильевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем большое спасибо!
Оказывается рекурсия на SQL в DB2 это очень просто(хотя на С++ привычнее, но это уже языковые особенности).
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / дерево и SQl
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]