Postgres рекурсивный запрос - получить путь к root с заданным листовым узлом - PullRequest
2 голосов
/ 18 января 2020

У меня есть листовой узел в древовидной структуре, и мне нужен запрос Postgres для рекурсивного обхода родительских узлов, чтобы получить полный путь к моему листовому узлу.

Моя таблица выглядит так - проблема в том, что нет определенного c root узла (т. е. топ-менеджеры заканчивают тем, что отчитываются друг перед другом)

+----+------------+-------+
| id | manager_id | name  |
+----+------------+-------+
|  1 |          2 | Matt  |
|  2 |          1 | Simon |
|  3 |          1 | John  |
|  4 |          2 | Bob   |
|  5 |          4 | Bill  |
+----+------------+-------+

Учитывая пользователя, такого как Билл (id=5) Я после их строка отчета:

Matt > Simon > Bob > Bill (в идеале он просто останавливается у Мэтта, когда пытается go к уже пройденному узлу)

1 Ответ

3 голосов
/ 18 января 2020

Рекурсивный 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)
...