sql >> データベース >  >> RDS >> PostgreSQL

再帰クエリを使用して階層ツリー構造構造を逆方向にトラバースする方法

    更新2: 元の再帰クエリを書き直して、すべての累積/集計が再帰部分の外部で行われるようにしました。この回答の以前のバージョンよりもパフォーマンスが向上するはずです。これは、回答 と非常によく似ています。 同様の質問については、@a_horse_with_no_nameから。

      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
    ;
    

    結果は期待どおりです:

     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. 2つのフィールドの値が同じであるレコードの作成を防ぐにはどうすればよいですか?

    2. TOPNとBOTTOMNを選択します

    3. OracleタイプTABLEのJavaからストアドプロシージャを呼び出す

    4. T-SQL挿入前に値を変更する方法