Postgres 递归查询 - 获取给定叶节点的根路径

BAR*_*RNZ 3 sql postgresql recursive-query common-table-expression

我在树结构中有一个叶节点,我需要一个 Postgres 查询来递归遍历父节点以获得叶节点的完整路径。

我的表看起来像这样 - 问题是没有特定的根节点(即最顶层的经理最终互相报告)

+----+------------+-------+
| id | manager_id | name  |
+----+------------+-------+
|  1 |          2 | Matt  |
|  2 |          1 | Simon |
|  3 |          1 | John  |
|  4 |          2 | Bob   |
|  5 |          4 | Bill  |
+----+------------+-------+
Run Code Online (Sandbox Code Playgroud)

对于像比尔这样的用户,(id=5)我正在寻找他们的报告线:

Matt > Simon > Bob > Bill(理想情况下,当它尝试前往已遍历的节点时,它会停在 Matt 处)

Jim*_*nes 7

递归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');
Run Code Online (Sandbox Code Playgroud)

询问

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)
Run Code Online (Sandbox Code Playgroud)

演示:db<>fiddle