Вопрос

У меня есть запрос Oracle с предложением NOCYCLE, который я должен перевести на postgres:

SELECT FG_ID,CONNECT_BY_ROOT FG_ID as Parent_ID  
FROM FG t
START WITH t.Parent_filter_group_id is null 
CONNECT BY NOCYCLE PRIOR t.FILTER_GROUP_ID = t.PARENT_FILTER_GROUP_ID 
.

Я преобразовал этот с помощью вопроса и ответа в connect_by_root эквивалентен в postgres

как

with recursive fg_tree as (
select FG_ID,
       FG_ID as fg
from  FG
where Parent_filter_group_id is null 

union all 
select c.FG_ID,
p.fg
from FG c join fg_tree p on p.FG_ID = PARENT_FILTER_GROUP_ID
)
select * from fg_tree
order by FG_ID
.

Но в этом нет предложения для NOCYCLE, если родитель также является одним из детей, тогда этот запрос вернет ошибку.

Это было полезно?

Решение

Вы можете собрать идентификаторы для каждого уровня, а затем присоединиться к условию, что «ток» идентификатор не содержится в пути:

with recursive fg_tree as (
  select FG_ID,
         FG_ID as fg, 
         array[fg_id] as path
  from  FG
  where Parent_filter_group_id is null 

  union all 

  select c.FG_ID,
         p.fg, 
         p.fg||c.fg_id
  from FG c 
    join fg_tree p on p.FG_ID and c.fg_id <> ALL (p.path)
)
select fg_id, fg 
from fg_tree
order by filter_group_id
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top