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)