Добавление последовательности ячеек, связанных ссылкой id, в postgresql - PullRequest
0 голосов
/ 30 октября 2018

У меня есть таблица foo со столбцами id, number_of_foos и parent_foo. number_of_foos является целым числом, а parent_foo является ссылкой на id другой строки. Каждая строка будет иметь целое число в parent_foo или null, если у нее нет родителя.

id | number_of_foos | parent_foo
---+----------------+-----------
 1 |             10 |       null
 2 |             7  |       null
 3 |             6  |       null
 4 |             13 |          1
 5 |             9  |          3
 6 |             1  |          4

Учитывая число id, я хочу найти общее количество «foo» в «цепочке foo», то есть количество foos для этого идентификатора и его родителя (и его родителя, и его родителя ..) .). Так, например, общее количество foos WHEN id = 6 равно 1 + 13 + 10 = 24.

Хорошо.

НО , я также хочу вычесть 1 для каждого родителя. Так что WHEN id = 6 на самом деле (1 + 13 + 10) - 2 = 22.

Возможно ли это?

1 Ответ

0 голосов
/ 30 октября 2018

демо: дБ <> скрипка

WITH RECURSIVE rec AS (
    SELECT 
        parent_foo,
        number_of_foos
    FROM foo
    WHERE id = 6

    UNION

    SELECT
        f.parent_foo,
        r.number_of_foos + f.number_of_foos - 1
    FROM foo f
    JOIN rec r ON f.id = r.parent_foo
)
SELECT number_of_foos 
FROM rec
WHERE parent_foo IS NULL;

Используя WITH RECURSIVE CTE , вы можете пробежаться по вашей структуре данных. Рекурсивный CTE состоит из двух частей:

  1. Начальная точка: выбор первого ряда. В вашем случае родитель первого значения и его значение number_of_foos.
  2. Часть рекурсии, в которой вы выбираете строку с id == parent_foo последней рекурсии. На этом этапе вы также можете интегрировать добавляемую часть: просто добавьте новую numbers_of_foo - 1 к последней.

Наконец, вы можете выдать строку без какого-либо родителя, который является старшим родителем вашего начального значения, и содержит ожидаемую сумму.

...