【问题标题】:Count all child for a GUID column计算 GUID 列的所有子项
【发布时间】:2019-06-26 20:08:27
【问题描述】:

我想要一个特定父级存在的所有子级和子级的计数。

我有这些数据:

 |                     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。

有什么建议吗?

【问题讨论】:

    标签: sql sql-server tsql recursion common-table-expression


    【解决方案1】:

    首先,我使用以下查询来创建临时表

    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,我只想要一个特定的计数而不是所有记录的计数
    • 我的实际包含两个列的 GUID,它给了我 uniqueidentifier is incompatible with tinyint 任何帮助? @hadi 我在其他我必须更改的地方添加了 = '736F8C6A-D58D-442E-BE2E-3B9F0595C58B'
    • @abhi 将 WHERE T2.ParentID > 0 替换为 WHERE T2.ParentID IS NOT NULL
    • 是的,我试过了,效果很好。但我没有太多数据。一段时间后会检查并确定它是否有效,然后我将其标记为答案。目前遇到了一些其他的 SQL 查询问题。如果您可以与我联系,这将无法在 StackOverflow 上解释,这将是一个很大的帮助contact
    猜你喜欢
    • 2019-08-04
    • 1970-01-01
    • 2011-03-04
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-22
    相关资源
    最近更新 更多