Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Заменить connect by на sql  [new]
RedRose
Member

Откуда:
Сообщений: 63
Народ, не нашла ни в архивах ни в интернете. т.е. то что нашла, не очень работает.

Есть таблица и запрос


program_id program_level parent_id
-3 1 null
1 1 null
-1 1 null
-2 1 null
2 2 1
3 2 1
4 2 1
729 2 1
1169 2 1
1320 2 1
1171 2 1
1150 2 1
1170 2 1
1152 2 1
1151 2 729
5 3 2
6 3 2
1323 3 2
1620 3 2
1547 3 2
1541 3 2
1531 3 2
1190 3 2
1189 3 2
1188 3 2
1185 3 2
1201 3 2
1200 3 2
1154 3 2
1149 3 2
1145 3 2
1014 3 2
1009 3 2
1001 3 2
1174 3 2

SELECT program_id
FROM program
WHERE program_level = 1
START WITH program_id = 3
CONNECT BY PRIOR parent_id = program_id;

Надо его заменить на другой, без иерархии.

Пытаюсь сделать:

with c ( program_id, program_level) as
(select program_id, program_level
from program p
WHERE program_level = 1
union all
select c.program_id program_id, c.program_level program_level
from program p join c on p.program_level = c.program_level and c.program_id = 3 )
select program_id from c


Тогда получается несколько строк. Если убрать c.program_id = 3 из второй выборки и поставить условием основного запроса, тогда ошибка:

ORA-32044: cycle detected while executing recursive WITH query

как сделать?
спасибо большое

К сообщению приложен файл. Размер - 18Kb
12 июл 18, 19:09    [21567073]     Ответить | Цитировать Сообщить модератору
 Re: Заменить connect by на sql  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10043
with program(program_id,program_level,parent_id) as
(
 select -3,1,null from dual union all
 select 1,1,null from dual union all
 select -1,1,null from dual union all
 select -2,1,null from dual union all
 select 2,2,1 from dual union all
 select 3,2,1 from dual union all
 select 4,2,1 from dual union all
 select 729,2,1 from dual union all
 select 1169,2,1 from dual union all
 select 1320,2,1 from dual union all
 select 1171,2,1 from dual union all
 select 1150,2,1 from dual union all
 select 1170,2,1 from dual union all
 select 1152,2,1 from dual union all
 select 1151,2,729 from dual union all
 select 5,3,2 from dual union all
 select 6,3,2 from dual union all
 select 1323,3,2 from dual union all
 select 1620,3,2 from dual union all
 select 1547,3,2 from dual union all
 select 1541,3,2 from dual union all
 select 1531,3,2 from dual union all
 select 1190,3,2 from dual union all
 select 1189,3,2 from dual union all
 select 1188,3,2 from dual union all
 select 1185,3,2 from dual union all
 select 1201,3,2 from dual union all
 select 1200,3,2 from dual union all
 select 1154,3,2 from dual union all
 select 1149,3,2 from dual union all
 select 1145,3,2 from dual union all
 select 1014,3,2 from dual union all
 select 1009,3,2 from dual union all
 select 1001,3,2 from dual union all
 select 1174,3,2 from dual
),
r(program_id,program_level,parent_id) as
(
   select  program_id,program_level,parent_id
     from  program
     where program_id = 3
  union all
   select  p.program_id,p.program_level,p.parent_id
    from  r,
          program p
    where r.parent_id = p.program_id
)
select  *
  from  r
  where program_level = 1
/


PROGRAM_ID PROGRAM_LEVEL  PARENT_ID
---------- ------------- ----------
         1             1

SQL> 


SY.
12 июл 18, 19:49    [21567136]     Ответить | Цитировать Сообщить модератору
 Re: Заменить connect by на sql  [new]
RedRose
Member

Откуда:
Сообщений: 63
спасибо большое
12 июл 18, 21:42    [21567293]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить