Вопрос взят отсюда:
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:
Ссылка на запрос для одного корня:
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 как я поняла будет храниться неточная информация для второго дерева, поэтому он и выведет неточное кол-во узлов.
Что нужно изменить в запросе, чтобы он корректно посчитал количество узлов для нескольких деревьев?
В гуглу нет решений, где есть более одного дерева.
Заранее спасибо