这是我的表:
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
(父节点)在列表中。任何帮助将不胜感激。
答案 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名。