PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Używanie rekurencyjnego CTE z Ecto

Udało mi się to osiągnąć za pomocą fragmentu. Oto przykład kodu, którego użyłem. Prawdopodobnie przeniosę tę metodę do procedury składowanej.

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
)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Grupuj i zliczaj zdarzenia w odstępach czasu plus suma biegowa

  2. Zapytanie Postgres jest bardzo wolne z current_date::date zamiast zakodowanej na stałe daty

  3. Zapytania Postgres w produkcji skutkują nienormalnie wysokimi operacjami we/wy odczytu dysku

  4. wybierz/wyświetl ostatnio wstawiony identyfikator seryjny w postgresie

  5. Uaktualnianie kolumny varchar do typu enum w postgresql