代码之家  ›  专栏  ›  技术社区  ›  Hazior

获取所有子单元的更有效方法

  •  0
  • Hazior  · 技术社区  · 14 年前

    我在sql中有一个通过parentid链接到自身的表。我想找到孩子和他们的孩子等等,直到我找到所有的孩子对象。我有一个递归函数来实现这一点,但它似乎非常无效。

    有没有办法让sql找到所有子对象?如果是这样怎么办?

    使用:Microsoft SQL Server Management Studio Express 9.00.2047.00

    3 回复  |  直到 14 年前
        1
  •  2
  •   Adriaan Stander    14 年前

    看看使用 Sql Server 2005 CTEs .

    DECLARE @Table TABLE(
            ID INT,
            Val VARCHAR(10),
            ParentID INT
    )
    
    INSERT INTO @Table SELECT 1, 'A', NULL
    INSERT INTO @Table SELECT 2, 'B', NULL
    INSERT INTO @Table SELECT 3, 'C', 1
    INSERT INTO @Table SELECT 4, 'D', 1
    INSERT INTO @Table SELECT 5, 'E', 4
    INSERT INTO @Table SELECT 5, 'F', 2
    
    ;WITh Parents AS (
        SELECT  *,
                CAST(Val + '/'  AS VARCHAR(100))PathVal
        FROm    @Table
        WHERE   ParentID IS NULL
        UNION ALL
        SELECT  t.*,
                CAST(p.PathVal + t.Val + '/' AS VARCHAR(100))
        FROM    @Table t INNER JOIN 
                Parents p ON t.ParentID = p.ID
    )
    SELECT  *
    FROM    Parents
    

    根据树的深度,您可能需要查看

    MAXRECURSION 查询提示

        2
  •  0
  •   Andras Vass    14 年前

    你在找 CTEs .
    Using Common Table Expressions, MSDN .
    您至少需要SQL Server 2005。

        3
  •  0
  •   Jakob    14 年前

    我建议你做点 Nested Set Model .

    其思想是为每个节点存储另外两个整数(通常称为“left”和“right”),这两个整数是根据一个系统计算的,您可以通过跟踪链接了解更多信息。然后对任意节点的所有子节点的查询就变得微不足道了。

    编辑: Here 更详细的描述。