PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Cách duyệt ngược cấu trúc cấu trúc cây phân cấp bằng cách sử dụng truy vấn đệ quy

CẬP NHẬT 2: Tôi đã viết lại truy vấn đệ quy ban đầu để tất cả tích lũy / tổng hợp được thực hiện bên ngoài phần đệ quy. Nó sẽ hoạt động tốt hơn phiên bản trước của câu trả lời này. Điều này rất giống với câu trả lời từ @a_horse_with_no_name cho một câu hỏi tương tự.

  WITH 
    RECURSIVE search_graph(edge, from_node, to_node, length, area, start_node) AS
    (
        SELECT edge, from_node, to_node, length, area, from_node AS "start_node"
        FROM tree
        UNION ALL
        SELECT o.edge, o.from_node, o.to_node, o.length, o.area, p.start_node
        FROM tree o
    JOIN search_graph p ON p.from_node = o.to_node
    )
    SELECT array_agg(edge) AS "edges"
       -- ,array_agg(from_node) AS "nodes"
          ,count(edge) AS "edge_count"
          ,sum(length) AS "length_sum"
          ,sum(area) AS "area_sum"
    FROM search_graph
    GROUP BY start_node
    ORDER BY start_node
;

Kết quả như mong đợi:

 start_node | edges       | edge_count | length_sum |  area_sum
------------+-------------+------------+------------+------------
  1         | {A}         |          1 |        1.1 |       0.9
  2         | {B}         |          1 |        1.2 |       1.3
  3         | {C}         |          1 |        1.8 |       2.4
  4         | {D,B,A}     |          3 |        3.5 |       3.5
  5         | {E,D,C,B,A} |          5 |        6.4 |       6.8



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để định cấu hình HikariCP cho postgresql?

  2. Cách liệt kê tất cả cơ sở dữ liệu với ActiveRecord

  3. Thời gian chờ của Python psycopg2

  4. Gán giá trị biến bằng mệnh đề RETURNING

  5. PDO không ném ngoại lệ với các tham số không liên kết (và không có biến trong truy vấn)