2010-04-06 54 views
0

我有一个通过parentID链接到自己的SQL表。我想找到孩子和他们的孩子等,直到我找到所有的孩子对象。我有一个这样做的递归函数,但它看起来非常无效。更有效的方法抓住所有的孩子单位

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

使用:Microsoft SQL Server管理Studio Express的9.00.2047.00

+0

这些查询通常由手工(或查询设计器)用'INNER JOIN'和'LEFT JOIN'编写。 – 2010-04-06 20:19:55

+0

我想找到孩子和他们的孩子等等,直到我找到所有的子对象 – Hazior 2010-04-06 20:21:59

+2

对于什么数据库?请包括版本。 – 2010-04-06 20:22:26

回答

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查询提示

+0

代码胜利。 +1 :) – 2010-04-06 20:47:32

+0

感谢这有助于很多。我现在明白递归SQL谢谢。 – Hazior 2010-04-07 13:43:20

0

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

+0

我想找到孩子和他们的孩子等等,直到我找到所有的子对象 – Hazior 2010-04-06 20:22:44

+0

正如安德拉斯所说,你可以用递归查询和CTE来做到这一点。 (http://msdn.microsoft.com/en-us/library/ms186243.aspx) – Todd 2010-04-06 20:24:37

0

我建议类似的Nested Set Model

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

编辑:Here是一个更详细的描述。

+0

哦,只是意识到,也许你不能改变你的表的架构。如果是这样,那么这个答案是无用的。但如果可以的话,这是一个有趣的选择。 – Jakob 2010-04-06 20:31:30

相关问题