0

以下是表格中的一些条目:

id r_id a_id p_id

1 9 9 0 2 9 105 108 3 9 102 9 4 9 106 105 5 9 108 102 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
5 9 108 102
2 9 105 108
4 9 106 105
6 10 10 0
8 10 12 10
10 10 18 12
7 10 15 18
9 10 16 15

好吧,我在这里问了一个类似的问题,但问题并不完整,我也得到了一些很好的答案。编辑该问题可能会使答案不可接受,因此我没有编辑并将其添加为此处的新问题。

  • 根项目的 p_id = 0
  • 一个 r_id 只能有一个 p_id = 0
  • 显示的需要运行 Query 的表可能未相对于根进行排序。
  • 我正在寻找可以在 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

只需更改 ORDER BY:

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 回答