powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Рекурсия?
4 сообщений из 4, страница 1 из 1
Рекурсия?
    #34432663
Dmitry Y.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый.


Задача вроде простоая- но вот сижу голову ломаю..


Есть таблица соответствия между элементами

Типа два первых поля индефикаторы элементов, третье коэф. соответствия:

with (a,b,cnt)

Элемент1,Элемент2,1
Элемент1,Элемент3,2


Надо сделать выборку всей соответствий, те результат такой:

Элемент1,Элемент2,1
Элемент1,Элемент3,2
Элемент2,Элемент1,1
Элемент3,Элемент1,0.5
Элемент3,Элемент2,0.5
Элемент2,Элемент3,2
...
Рейтинг: 0 / 0
Рекурсия?
    #34432664
Dmitry Y.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема в том, что в рекурсии нельзя сделать двойную выборку из родителя:



with d0(a,b,cnt) as
(
SELECT t1.a,t1.b,t1.cnt FROM elements t1
UNION ALL
SELECT t1.b,t1.a,1/t1.cnt FROM elements t1
),
d1(a,b,cnt,lvl) as
(
select d0.a,d0.b,d0.cnt,1 from d0
UNION ALL
(
select t1.a,t2.a,t1.cnt/t2.cnt,t1.lvl+1 from d1 as t1, d1 as t2
where t1.b=t2.b and t1.a!=t2.a (t1.a,t2.a) not in (select a,b from d1)
)

) select * from d1 ;


Ругается "from d1 as t1, d1 as t2" на это место.
...
Рейтинг: 0 / 0
Рекурсия?
    #34432703
Dmitry Y.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
with elements(a,b,cnt) as
(
VALUES ('Элемент1','Элемент2',1.0),
('Элемент1','Элемент3',2.0),
('Элемент3','Элемент4',1.0),
('Элемент4','Элемент5',1.0)

),
d0(a,b,cnt) as
(
SELECT t1.a,t1.b,t1.cnt FROM elements t1
UNION ALL
SELECT t1.b,t1.a,1/t1.cnt FROM elements t1
),
d1(a,b,cnt,lvl) as
(
select d0.a,d0.b,cast(d0.cnt as double),1 from d0
UNION ALL
(
select t1.a,t2.a,case when t2.cnt=0 then 0 else t1.cnt/t2.cnt end,t1.lvl+1 from d1 as t1, d0 as t2
where t1.b=t2.b and t1.a!=t2.a and (t1.a,t2.a) not in (select a,b from d0) and lvl<10
)

) select * from d1 ;



с двумя элементами - ок, с 3 уровнями рекурсии входит в штопор:(
...
Рейтинг: 0 / 0
Рекурсия?
    #34432758
Dmitry Y.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тихо сам с собой веду беседу:)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
with elements(a,b,cnt) as
(
VALUES ('Элемент1','Элемент2', 1 . 0 ),
('Элемент1','Элемент3', 2 . 0 ),
('Элемент3','Элемент4', 1 . 0 ),
('Элемент4','Элемент5', 1 . 0 )

),
d0(a,b,cnt,his) as
(
SELECT t1.a,t1.b,t1.cnt,cast(t1.a||'^'||t1.b as varchar( 200 )) FROM elements t1
UNION ALL
SELECT t1.b,t1.a, 1 /t1.cnt,cast(t1.b||'^'||t1.a as varchar( 200 )) FROM elements t1
),
d1(a,b,cnt,lvl,his) as 
(
select d0.a,d0.b,cast(d0.cnt as double), 1 , his  from d0
UNION ALL
(
select t1.a,t2.a,case when t2.cnt= 0  then  0  else t1.cnt/t2.cnt end,t1.lvl+ 1 ,t1.his||'^'||t2.a from d1 as t1, d0 as t2 
where t1.b=t2.b and t1.a!=t2.a and  LOCATE(t2.a,t1.his)= 0  and  LOCATE(t1.a,t2.his)= 0   and t1.lvl< 10 
)

) select * from d1 ;



вариант. вроде работает.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Рекурсия?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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