@anya_hacker

Как посчитать количество узлов в дереве SQL?

Вопрос взят отсюда:
https://stackoverflow.com/questions/49636142/how-t...
Есть дерево-таблица. Нужно посчитать количество узлов в дереве.
Код создания таблицы и сам рекурсивный запрос для сбора узлов:
INSERT INTO Organization_structure VALUES
(100, NULL),
(129, 100),
(134, 100),
(439, 129),
(450, 129),
(133, 134),
(133, 134),
(501, 439),
(602, 501);


with tree as
(
    select orgId, parentId,0 as tree_order, path = cast('root' as varchar(100)) 
    from   Organization_structure 
    where  parentID is null
    union all
    select os.orgId, os.parentId, 1 + tree_order as tree_order,
           path = cast(tree.path + '/' + right(('000000000' + os.orgId), 10) as varchar(100))
    from   Organization_structure os
    join   tree 
    on     tree.orgId = os.parentId
)
select orgId, tree_order, path, t2.cnt 
from tree
cross apply (select count(*) cnt from tree t1 where t1.path like tree.path + '%') t2
order by tree_order;

В path он хранит путь до этого узла, все предыдущие узлы:
root/134/133
Запрос выводит корректное число узлов: 11.
Но есть добавить ещё одну ветку (т.е. у нее parentid = null, это корень, главный узел):
(1000, null),
и у неё пусть к примеру не будет других узлов (у которых parentId = 1000), то данный запрос выведет для неё тоже 11 узлов, хотя должен вывести 1 (сам этот корень, у которого parentid = 1000).
Если добавить к узлу новый узел: (2000, 1000), то получается в дереве уже 2 узла, но запрос всё равно выведет 11:
6226e70299cd9403104173.png
Ссылка на запрос для одного корня:
https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=6...
Здесь продемонстрирован второй корень:
https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=6...
субд ms server
Следует убрать условие where, чтобы запрос работал не только для первого дерева, а для всех.
Но и количество узлов тогда он считает вообще для ВСЕХ одинаковое: 27
https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=1...
В path как я поняла будет храниться неточная информация для второго дерева, поэтому он и выведет неточное кол-во узлов.
Что нужно изменить в запросе, чтобы он корректно посчитал количество узлов для нескольких деревьев?
В гуглу нет решений, где есть более одного дерева.
Заранее спасибо
  • Вопрос задан
  • 226 просмотров
Решения вопроса 1
tsklab
@tsklab Куратор тега SQL Server
Здесь отвечаю на вопросы.
I want to display count of children for every node in the tree.
Дочерних, а не всех! Все приведённые решения неверные поскольку считают и сам узел.

Перейдём от теории к практике.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы