SQL数据库父/子递归

时间:2013-12-06 20:56:41

标签: sql sql-server database recursion recursive-query

这是我的表:

parent_id | child_id
--------------
        1 | 2
        1 | 3
        1 | 4
        2 | 5
        2 | 6
        5 | 8
        8 | 9
        9 | 5

我需要获取父2下的所有项目。我发现了一些与此类似的东西,但是无法弄清楚如何让它适合我的情况。我一直达到maximum recursion限制。这就是我所拥有的:

WITH CTE AS
(
    SELECT gt.[child_id]
      FROM [CHSPortal].[dbo].[company_adgroupstoadgroups] gt
     WHERE gt.parent_id='2'

    UNION ALL

    SELECT g.[child_id]
      FROM [CHSPortal].[dbo].[company_adgroupstoadgroups] g
      INNER JOIN CTE g2 on g.parent_id=g2.child_id
)
select distinct child_id from CTE

期望的结果将是:2,3,4,5,6,8,9。

我需要做些什么修改才能获得子2下所有项目的列表。我也希望2(父节点)在列表中。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

首先,你的例子中有一个循环(5 | 8,8 | 9,9 | 5),这就是你达到最大递归限制的原因。

关于过滤问题,您可以在下面找到根节点过滤的示例:

;WITH MTree (parent_id, child_id, LEVEL) AS (
    SELECT t.parent_id , t.child_id, 0 AS LEVEL 
    FROM table_1 t
    WHERE child_id = 2 --here you can filter the root node
UNION ALL      
    SELECT m.parent_id , m.child_id, LEVEL + 1
    FROM Table_1 m
        INNER JOIN MTree t ON t.child_id = m.parent_id
)

SELECT * FROM Mtree;

答案 1 :(得分:0)

除了与您提供的示例数据无关外,不确定您的查询有什么问题,但这样做很好:

;WITH src AS (SELECT 1 AS parent_id, 2 AS child_id
               UNION  SELECT 1, 3
               UNION  SELECT 1, 4
               UNION  SELECT 2, 5
               UNION  SELECT 2, 6
               UNION  SELECT 5, 8
               UNION  SELECT 8, 9
               UNION  SELECT 9, 5)
    ,cte AS (SELECT *
             FROM src
             WHERE child_id = 2
             UNION  ALL
             SELECT a.*
             FROM src a
             JOIN cte b
               ON a.parent_id = b.child_id           
            )
SELECT TOP 100 *
FROM cte

- 由于样本数据的无限递归问题,限于前100名。