NOCYCLE in Postgres
-
21-12-2019 - |
Frage
Ich habe eine Oracle-Abfrage mit einem NOCYCLE
Klausel, die ich in Postgres übersetzen muss:
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
Ich habe dies mit Hilfe der Frage und Antwort in umgewandeltconnect_by_root-Äquivalent in Postgres
als
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
aber darin gibt es keine Klausel dafür NOCYCLE
Wenn das übergeordnete Element auch eines der untergeordneten Elemente ist, gibt diese Abfrage einen Fehler zurück.
Lösung
Sie können die IDs für jede Ebene sammeln und dann unter der Bedingung beitreten, dass die „aktuelle“ ID nicht im Pfad enthalten ist:
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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow