Postgres 递归查询 - 给定叶节点获取根路径
Postgres recursive query - get path to root given a leaf node
我在树结构中有一个叶节点,我需要一个 Postgres 查询来递归遍历父节点以获得叶节点的完整路径。
我的 table 看起来像这样 - 问题是没有特定的根节点(即最顶层的管理者最终相互报告)
+----+------------+-------+
| id | manager_id | name |
+----+------------+-------+
| 1 | 2 | Matt |
| 2 | 1 | Simon |
| 3 | 1 | John |
| 4 | 2 | Bob |
| 5 | 4 | Bill |
+----+------------+-------+
给定一个用户,例如 Bill (id=5)
我在他们的报告线之后:
Matt > Simon > Bob > Bill
(理想情况下,当它试图去到一个已经遍历的节点时,它就停在 Matt 处)
递归 CTE
就是您要找的。
数据样本
CREATE TEMPORARY TABLE t
(id INT, manager_id INT, name TEXT);
INSERT INTO t VALUES
(1,2,'Matt'),(2,1,'Simon'),
(3,1,'John'),(4,2,'Bob'),
(5,4,'Bill');
查询
WITH RECURSIVE man(a,b,c) AS (
SELECT manager_id, id,name FROM t
UNION
SELECT man.a, id,man.c FROM man, t
WHERE man.b = manager_id)
SELECT a,c FROM man
WHERE b = 5;
a | c
---+-------
4 | Bill
2 | Bob
1 | Simon
2 | Matt
(4 Zeilen)
我在树结构中有一个叶节点,我需要一个 Postgres 查询来递归遍历父节点以获得叶节点的完整路径。
我的 table 看起来像这样 - 问题是没有特定的根节点(即最顶层的管理者最终相互报告)
+----+------------+-------+
| id | manager_id | name |
+----+------------+-------+
| 1 | 2 | Matt |
| 2 | 1 | Simon |
| 3 | 1 | John |
| 4 | 2 | Bob |
| 5 | 4 | Bill |
+----+------------+-------+
给定一个用户,例如 Bill (id=5)
我在他们的报告线之后:
Matt > Simon > Bob > Bill
(理想情况下,当它试图去到一个已经遍历的节点时,它就停在 Matt 处)
递归 CTE
就是您要找的。
数据样本
CREATE TEMPORARY TABLE t
(id INT, manager_id INT, name TEXT);
INSERT INTO t VALUES
(1,2,'Matt'),(2,1,'Simon'),
(3,1,'John'),(4,2,'Bob'),
(5,4,'Bill');
查询
WITH RECURSIVE man(a,b,c) AS (
SELECT manager_id, id,name FROM t
UNION
SELECT man.a, id,man.c FROM man, t
WHERE man.b = manager_id)
SELECT a,c FROM man
WHERE b = 5;
a | c
---+-------
4 | Bill
2 | Bob
1 | Simon
2 | Matt
(4 Zeilen)