PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Cara melintasi struktur struktur pohon hierarkis ke belakang menggunakan kueri rekursif

PEMBARUAN 2: Saya menulis ulang kueri rekursif asli sehingga semua akumulasi/agregasi dilakukan di luar bagian rekursif. Ini harus berkinerja lebih baik daripada versi sebelumnya dari jawaban ini. Ini sangat mirip dengan jawaban dari @a_horse_with_no_name untuk pertanyaan serupa.

  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
;

Hasil seperti yang diharapkan:

 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. KESALAHAN:izin ditolak untuk nama tabel relasi di Postgres saat mencoba SELECT sebagai pengguna hanya-baca

  2. Bagaimana cara mengakses prosedur yang mengembalikan setof refcursor dari PostgreSQL di Jawa?

  3. Mencari bidang terenkripsi di Postgres

  4. Ekstrak bagian numerik pertama dari bidang

  5. Kueri berdasarkan koordinat terlalu lama - opsi untuk dioptimalkan?