PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Verwenden von rekursivem CTE mit Ecto

Ich konnte dies mit einem Fragment erreichen. Hier ist ein Beispiel für den Code, den ich verwendet habe. Ich werde diese Methode wahrscheinlich in eine gespeicherte Prozedur verschieben.

Repo.all(MyProj.User,
  from u in MyProj.User,
  join: un in MyProj.UserNode, on: u.id == un.user_id,
  join: nt in fragment("""
  (
    WITH RECURSIVE node_tree AS (
      SELECT *
      FROM nodes
      WHERE nodes.id = ?
    UNION ALL
      SELECT n.*
      FROM nodes n
      INNER JOIN node_tree nt ON nt.parent_id == n.id
    )
  ) SELECT * FROM node_tree
  """, ^node_id), on: un.node_id == nt.id
)