MS SQL нужно Выбрать все разделы и подсчитать количество потомков во всех его узлах(по его ветке). Через рекурсию

Имеется таблица вида:

ID  ParentID    Name
1   0   Раздел 1
2   0   Раздел 2
3   0   Раздел 3
4   1   Раздел 4
5   1   Раздел 5
6   4   Раздел 6
7   2   Раздел 7
8   2   Раздел 8
9   3   Раздел 9
10  2   Раздел 10
11  2   Раздел 11
12  11  Раздел 12
13  6   Раздел 13
14  6   Раздел 14
15  9   Раздел 15
16  9   Раздел 16
17  9   Раздел 17
18  9   Раздел 18
19  17  Раздел 19
20  19  Раздел 20

Как Выбрать все разделы и подсчитать количество потомков во всех его узлах(по его ветке)?

WITH rec4 (id, pid, name)
AS 
(
    SELECT id, parentID, name
    FROM parent 
    WHERE id = 1
    UNION ALL
    SELECT p.id, p.parentID, p.name
    FROM parent AS p
        JOIN rec4 AS r ON p.parentID = r.id
)
SELECT * FROM rec4 ;

Так показывает дочерние элементы только одного родителя. Как выбрать всех и показать их количество?


Ответы (1 шт):

Автор решения: Akina
WITH rec4 (id, pid, name, root_id)
AS 
(
    SELECT id, parentID, name, id root_id
    FROM parent 
    WHERE ParentID = 0
    UNION ALL
    SELECT p.id, p.parentID, p.name, root_id
    FROM parent AS p
        JOIN rec4 AS r ON p.parentID = r.id
)
SELECT COUNT(*) AS tree_nodes_amount
FROM rec4
GROUP BY root_id;

https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=be949ede1740a5bad81bcb201160e164

→ Ссылка