抓住所有儿童单位的更有效方法

时间:2010-04-06 20:16:18

标签: c# sql database

我在SQL中有一个表,它通过parentID链接到自己。我想找到孩子和他们的孩子等等,直到找到所有的孩子对象。我有一个递归功能,但它似乎非常无效。

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

使用:Microsoft SQL Server Management Studio Express 9.00.2047.00

3 个答案:

答案 0 :(得分:2)

请查看使用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查询提示

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我建议像Nested Set Model

这个想法是为每个节点存储另外两个整数(通常称为“左”和“右”),根据您可以通过链接阅读更多信息的系统计算。然后查询任意节点的所有后代变得微不足道。

修改: Here是一个更详细的说明。