计算 GUID 列的所有子项
Count all child for a GUID column
我想要一个特定父项所在位置的所有子项和子项的计数。
我有这个数据:
| 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
,那么它应该 return 它的子孙总数 - 即总共 2 个。
有什么建议吗?
首先,我使用以下查询创建临时文件 table
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
结果是:
参考
更新 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
我想要一个特定父项所在位置的所有子项和子项的计数。
我有这个数据:
| 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
,那么它应该 return 它的子孙总数 - 即总共 2 个。
有什么建议吗?
首先,我使用以下查询创建临时文件 table
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
结果是:
参考
更新 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