Подсчитать всех дочерних элементов для столбца GUID - PullRequest
0 голосов
/ 02 февраля 2019

Я хочу подсчитать все дочерние и дочерние дочерние элементы, в которых существует конкретный родитель.

У меня есть эти данные:

 |                     Id                  | Parent 
 +-----------------------------------------+-------------------------------------+  
 |  736F8C6A-D58D-442E-BE2E-3B9F0595C58B   | NULL                                |
 |  CA828BBA-6657-46FC-BA26-7ED8C7FB220C   | 736F8C6A-D58D-442E-BE2E-3B9F0595C58B|
 |  2DB8A8F9-9F29-4F3A-907F-A6ACEDE12859   | 736F8C6A-D58D-442E-BE2E-3B9F0595C58B|

Если я передам 736F8C6A-D58D-442E-BE2E-3B9F0595C58B, тогда он долженвернуть общее количество своих детей и внуков - всего 2.

Есть предложения?

1 Ответ

0 голосов
/ 02 февраля 2019

Сначала я использовал следующий запрос для создания временной таблицы

CREATE TABLE #TBLTEMP(ID int, ParentID int)

INSERT INTO #TBLTEMP(ID,ParentID)
VALUES(1,NULL)
,(2,1)
,(3,2)
,(4,2)
,(5,3)
,(6,NULL)
,(7,6)
,(8,NULL)
,(9,NULL)

Затем я использовал следующий запрос для получения количества дочерних элементов

WITH CTE_1(ParentID) AS(
    SELECT ParentID FROM #TBLTEMP T1
    UNION ALL
    SELECT T2.ParentID FROM CTE_1 c
    INNER JOIN #TBLTEMP T2 ON c.ParentID = T2.ID
    WHERE T2.ParentID > 0
), CTE_2 AS ( SELECT ID , 0 as cnt FROM #TBLTEMP T3 WHERE NOT EXISTS (SELECT 1 FROM CTE_1 c2 where c2.ParentID = T3.ID))
SELECT ParentID, count(*) as cnt 
FROM CTE_1
WHERE ParentID IS NOT NULL
GROUP BY ParentID
UNION
SELECT ID as ParentID, cnt FROM CTE_2

ORDER BY ParentID

Результат:

enter image description here

Ссылка

Обновление 1

Чтобы получить учетную запись для определенного ID:

WITH CTE_1(ParentID) AS(
    SELECT ParentID FROM #TBLTEMP T1
    UNION ALL
    SELECT T2.ParentID FROM CTE_1 c
    INNER JOIN #TBLTEMP T2 ON c.ParentID = T2.ID
    WHERE T2.ParentID > 0
), CTE_2 AS ( SELECT ID , 0 as cnt FROM #TBLTEMP T3 WHERE NOT EXISTS (SELECT 1 FROM CTE_1 c2 where c2.ParentID = T3.ID)), CTE_3 AS(
SELECT ParentID, count(*) as cnt 
FROM CTE_1
WHERE ParentID IS NOT NULL
GROUP BY ParentID
UNION
SELECT ID as ParentID, cnt FROM CTE_2) 
SELECT cnt FROM CTE_3 WHERE ParentID = 1
...