或在公用表表达式中 - 过度递归

时间:2013-09-06 08:48:24

标签: sql sql-server recursion common-table-expression

我遇到了以下过多的递归问题,并且正在努力想象它出错的地方

我的数据如下:

Hierarchy       Id      RecNo   ParentRecord   Data
Mike            1       100     
Mike:b1         1       101     100            This One
Mike:b1:c1      1       102     101         
Mike:b1:c1:d    1       103     102
Mike:b1:c2:e    1       104     102
Mike:b2         1       110     100
Dave            2       200     
Dave:b4         2       201     200
Dave:b4:c3      2       202     201

我有以下UDF

CREATE FUNCTION [dbo].[IsParent] ( @HierarchyA VARCHAR(1000), @HierarchyB VARCHAR(1000) )
RETURNS INT
AS
BEGIN
DECLARE @ret INT
If dbo.CountChar(@HierarchyA, ':') >= dbo.Ifx_CountChar(@HierarchyB, ':')
    SET @ret = 0
ELSE IF LEFT(@HierarchyB, LEN(@HierarchyA + ':')) = @HierarchyA + ':'
    SET @ret = 1
ELSE
    SET @ret = 0        
RETURN @ret
END

CREATE FUNCTION [dbo].[CountChar] ( @Input VARCHAR(1000), @SearchChar CHAR(1) )
RETURNS INT
BEGIN
    RETURN (LEN(@Input) - LEN(REPLACE(@Input, @SearchChar, '')))
END

我的CTE如下:

With Trees (Id, Hierachy, RecNo, Tier)
AS
(
    SELECT Id, Hierachy, RecNo, dbo.CountChar(Hierachy, ':') as Tier
    FROM MyData 
    WHERE Data="This One"

UNION ALL   

    SELECT e.Id, e.Hierachy, e.RecNo, dbo.CountChar(e.Hierachy, ':') 
    FROM 
        MyData e 
    INNER JOIN 
        (SELECT Id, Hierachy, RecNo FROM Trees) s 
    ON e.Id = s.Id
    WHERE dbo.IsParent(s.Hierachy,e.Hierachy) = 1   
    OR dbo.IsParent(e.Hierachy,s.Hierachy) = 1  
)

SELECT * FROM Trees
ORDER BY Hierachy, Tier

如果我单独使用任何一个OR子句,cte工作正常,但是当我使用它们时,它会突然超出最大递归错误。

我正在尝试根据某些数据的值重建层次结构。因此,在找到具有特定数据值的行之后,我希望根据层次结构字段指定的层次关系来识别该行的所有父项和子项。所以在上面的例子中,我想要检索与Mike

相关的以下行
Mike            1       100     
Mike:b1         1       101     100            This One
Mike:b1:c1      1       102     101         
Mike:b1:c1:d    1       103     102
Mike:b1:c2:e    1       104     102

我想知道是否有人可以

  1. 解释如何避免过度递归问题
  2. 建议以这种方式使用Hierarchy(使用部分字符串匹配)是否(或不是)优于使用RecNo / ParentRecord关系遍历此实例中的树
  3. 很多thx IA

    取值

0 个答案:

没有答案