CTE递归并失败

时间:2015-10-30 01:03:50

标签: sql-server tsql

我已经创建了一个非常小的CTE递归函数,但似乎它一直是递归的并且失败了。 请在内容中找到详细信息:

表名称&数据:

insert into dbo.HierarchyEmployee     
Values
(1,1, 'Name1'),
(2,1, 'Name2'),
(3,4, 'Name3'),
(4,5, 'Name4'),
(5,2, 'Name5'),
(6,4, 'Name6'),
(7,1, 'Name7'),
(8,8, 'Name8'),
(9,3, 'Name9'),
(10,1, 'Name10')

理想的结果集:

HierarchyParent HierarchyID Name
1   1   Name
1   2   Name2
1   7   Name7
1   10  Name10

我试图通过隐居的CTE实现这一点,因为我想了解递归是如何工作的。

以下是使用的查询:

WITH CTE_HierarchyEmployee
AS
(
    SELECT  H.HierarchyID,
            H.HierarchyParent,
            H.Name
            FROM dbo.HierarchyEmployee H
            WHERE H.HierarchyID = 1
            UNION ALL
    SELECT  H.HierarchyID,
            H.HierarchyParent,
            H.Name
            FROM
            dbo.HierarchyEmployee H
            INNER JOIN  CTE_HierarchyEmployee CTEH
            ON H.HierarchyParent = cteh.HierarchyID
)
SELECT * FROM CTE_HierarchyEmployee

错误:

  

Msg 530,Level 16,State 1,Line 41

     

声明终止。在语句完成之前,最大递归100已经用尽。

感谢您输入如何解决反感。

1 个答案:

答案 0 :(得分:1)

编辑:我找出原因。问题出在样本数据中。最HierarchyID = 1的父亲也有ParentId = 1.在" NORMAL"在情况不是这样的情况下,大多数时候最顶层id的parentID是NULL。由于父级和HierarchyID相同(1),因此进入1的循环是1的父级。 有两种方法可以解决问题: 1.将HierarchyID = 1的parentID更新为NULL 2.在递归查询中添加额外的条件,其中H.HierarchyID<> 1

您只需在查询结束时添加OPTION(MAXRECURSION 0)即可超过100次递归的限制。参见:

WITH CTE_HierarchyEmployee
AS
(
    SELECT  H.HierarchyID,
            H.HierarchyParent,
            H.Name
            FROM dbo.HierarchyEmployee H
            WHERE H.HierarchyID = 1
            UNION ALL
    SELECT  H.HierarchyID,
            H.HierarchyParent,
            H.Name
            FROM
            dbo.HierarchyEmployee H
            INNER JOIN  CTE_HierarchyEmployee CTEH
            ON H.HierarchyParent = cteh.HierarchyID
)
SELECT * FROM CTE_HierarchyEmployee
OPTION (MAXRECURSION 0)