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.

War es hilfreich?

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
scroll top