PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Utilisation de CTE récursif avec Ecto

J'ai pu accomplir cela en utilisant un fragment. Voici un exemple du code que j'ai utilisé. Je vais probablement déplacer cette méthode vers une procédure stockée.

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
)