Nocycle a Postgres.
-
21-12-2019 - |
Domanda
Ho una query Oracle con una clausola NOCYCLE
che devo tradurre in 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
.
Ho convertito questo con l'aiuto della domanda e della risposta in connect_by_root equivalente a Postgres
AS
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
.
Ma in questo non c'è clausola per NOCYCLE
se il genitore è anche uno dei bambini, questa query restituirà errore.
Soluzione
È possibile raccogliere gli ID per ogni livello e quindi aderire alla condizione che l'ID "corrente" non è contenuto nel percorso:
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
. Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow