Pregunta

Tengo una consulta de Oracle con un NOCYCLE la cláusula que tengo que traducir a 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 

He convertido a éste con la ayuda de la pregunta y la respuesta en connect_by_root equivalente en postgres

como

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

pero en esto no hay ninguna cláusula para NOCYCLE si el padre es también uno de los niños, entonces esta consulta devolverá el error.

¿Fue útil?

Solución

Puede recopilar las ID para cada nivel y luego unirse a la condición de que la identificación "actual" no esté contenida en la ruta:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top