sql >> Base de Datos >  >> RDS >> PostgreSQL

Usando CTE recursivo con Ecto

Pude lograr esto usando un fragmento. Aquí hay un ejemplo del código que usé. Probablemente moveré este método a un procedimiento almacenado.

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
)