NOCYCLE en Postgres
-
21-12-2019 - |
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.
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