Рекурсия Postgres, возвращающая размер дерева каждой учетной записи - PullRequest
0 голосов
/ 11 декабря 2018

Для этого примера у меня есть база данных PostgreSQL, структурированная как дерево / пирамида.

Я могу получить дерево / нисходящий идентификатор учетной записи 1 из следующего:

with recursive ret (uplineid, accountid) as
(
  select a.uplineid, a.accountid from tree a
  where a.uplineid = 1
  union
  select c.uplineid, c.accountid from tree c
  join ret d on c.uplineid = d.accountid
)
select * from ret

У меня также естьдругая таблица, содержащая список идентификаторов.Я ищу, чтобы получить количество людей в дереве каждого человека.

Я выполнял эту рекурсию на своем внешнем интерфейсе, но это не супер идеал.Есть ли способ в postgreSQL выполнить эту рекурсию для каждого отдельного аккаунта в другой таблице, сгруппировав окончательный результат по их идентификатору?

1 Ответ

0 голосов
/ 12 декабря 2018

Хорошая отправная точка - убедиться, что вы сохраняете один и тот же root в своей рекурсии, как показано ниже (d.uplineid).У вас будет мало пользы, чтобы получить родителя только из вашего рекурсивного CTE.

with recursive ret (uplineroot, uplineid, accountid) as
(
  select a.uplineid, a.uplineid, a.accountid from tree a
  where a.uplineid = 1
  union
  select d.uplineroot, c.uplineid, c.accountid from tree c
  join ret d on c.uplineid = d.accountid
)
select * from ret

Следующий шаг - удалить начальный where или изменить его на что-то более удобное и вуаля!

with recursive ret (uplineroot, uplineid, accountid) as
(
  select a.uplineid, a.uplineid, a.accountid from tree a
  where NOT EXISTS (SELECT 1 from tree WHERE accountid= a.uplineid) 
  union
  select d.uplineroot, c.uplineid, c.accountid from tree c
  join ret d on c.uplineid = d.accountid
)
select * from ret

Для более точной настройки требуется больше информации о ваших таблицах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...