0

以下は、テーブルからのいくつかのエントリです。

id r_id a_id p_id

1 9 9 0 29105108 3 9 102 9 49106105 59108102 6 10 10 0 7 10 15 18 8 10 12 10 9 10 16 15 10 10 18 12

次のような出力を提供するSQLクエリを探しています。

1 9 9 0
3 9 102 9
59108102
29105108
49106105
6 10 10 0
8 10 12 10
10 10 18 12
7 10 15 18
9 10 16 15

さて、ここで同様の質問をしましたが、質問は完全ではなく、優れた回答もほとんど得られませんでした。その質問を編集すると回答が受け入れられなくなる可能性があるため、ここでは編集せずに新しい質問として追加しました。

  • ルートアイテムのp_id=0
  • 1つのr_idに対して、1つのp_id=0のみが存在できます
  • クエリを実行する必要があるテーブルは、ルートに関してソートされていない可能性があります。
  • PostgreSqlで動作するものを探しています

編集:アイデアは、{r_id、p_id} = xの行が{r_id、a_id}=xの行の下に来るように行を並べ替えることです。

4

2 に答える 2

2

前の質問への回答を変更すると、次のようになります...

WITH RECURSIVE sub(s_id, s_r_id, s_a_id, s_p_id, row) AS (
    SELECT id, r_id, a_id, p_id, 1 AS row FROM foo WHERE p_id = 0
UNION ALL
    SELECT id, r_id, a_id, p_id, (row + 1)  FROM foo JOIN sub ON s_a_id = p_id AND s_r_id = r_id
)
SELECT * FROM sub ORDER BY s_r_id, row;
于 2011-05-18T08:53:37.197 に答える
1

ORDERBYを変更するだけです。

WITH RECURSIVE sub(s_id, s_r_id, s_a_id, s_p_id, row) AS (
    SELECT id, r_id, a_id, p_id, 1 AS row FROM foo WHERE p_id = 0
UNION ALL
    SELECT id, r_id, a_id, p_id, (row + 1)  FROM foo JOIN sub ON s_a_id = p_id
)
SELECT * FROM sub
ORDER BY s_r_id ASC, row ASC
;
于 2011-05-18T09:29:31.193 に答える