SQL Server 2008:层次结构不严格的递归查询

SQL Server 2008:层次结构不严格的递归查询,sql,recursive-query,Sql,Recursive Query,我和一家大型跨国公司打交道。我有一张oldtir表格,显示子公司的所有权。此问题的字段包括: 此表的cID-PK 子公司的dpm_sub-FK dpm_pco-母公司的FK 年份-这是关系发生变化的年份,因为它们会随着时间的推移而变化 还有其他领域,但与此问题无关。请注意,没有专门指明顶级公司的记录,因此我们必须通过让它们不作为子公司出现来确定它们是哪些公司 我已将查询写在下面: with CompanyHierarchy([year], dpm_pco, dpm_sub, cID) as (s

我和一家大型跨国公司打交道。我有一张oldtir表格,显示子公司的所有权。此问题的字段包括:

此表的cID-PK 子公司的dpm_sub-FK dpm_pco-母公司的FK 年份-这是关系发生变化的年份,因为它们会随着时间的推移而变化 还有其他领域,但与此问题无关。请注意,没有专门指明顶级公司的记录,因此我们必须通过让它们不作为子公司出现来确定它们是哪些公司

我已将查询写在下面:

with CompanyHierarchy([year], dpm_pco, dpm_sub, cID)
as (select distinct oldtir.[year], cast(' ' as nvarchar(5)) as dpm_pco, oldtir.dpm_pco as dpm_sub, cast(0 as float) as cID
    from oldtir 
    where oldtir.dpm_pco not in 
       (select dpm_sub from oldtir oldtir2 
          where oldtir.[year] = oldtir2.[year]
            and oldtir2.dpm_sub <> oldtir2.dpm_pco)
      and oldtir.[year] = 2011
    union all 
    select oldtir.[year], oldtir.dpm_pco, oldtir.dpm_sub, oldtir.cID
    from oldtir 
      join CompanyHierarchy
        on CompanyHierarchy.dpm_sub = oldtir.dpm_pco 
        and CompanyHierarchy.[year] = oldtir.[year]
      where oldtir.[year] = 2011 
             )

select distinct CompanyHierarchy.[Year], 
       CompanyHierarchy.[dpm_pco], 
       CompanyHierarchy.dpm_sub, 
   from CompanyHierarchy
   order by 1, 2, 3
它使用msg 530失败:在语句完成之前,最大递归100已用尽

我认为问题在于表中的关系不是严格的等级关系。具体来说,一个子公司可以由多家公司拥有,甚至可以出现A拥有B和C的一部分,B也拥有C的一部分的情况。其他字段之一表示所有权的百分比

目前,我已经解决了这个问题,在赛道上增加了一个场地,并在几层之后任意停止。但这让我觉得很尴尬,因为我不能确定最大的级别数

有什么办法可以做到这一点吗

谢谢,
塔玛

感谢评论。他们让我回去更仔细地查看数据。事实上,数据中存在错误,导致无限递归。修复了数据,查询工作正常。

添加OPTION语句,看看它是否有影响。这将使递归级别增加到32K

select distinct CompanyHierarchy.[Year], 
   CompanyHierarchy.[dpm_pco], 
   CompanyHierarchy.dpm_sub, 
从公司制 按1、2、3顺序排列
选项maxrecursion 0

如果您用英语解释您试图获取的结果集类型,可能会有所帮助。另外,一些具有预期结果的样本数据通常对这类问题也很有用。继承权为100级的情况非常罕见,即a拥有B的一部分,B拥有C的一部分,等等,直到100级。我的猜测是,您的查询陷入了某种循环,并且一直在挖掘。一旦某个链完成,你必须停止挖掘,然后回到根/父链。是的,我同意我陷入了一个循环。我想,我的问题是如何摆脱困境。我尝试了一些条件,以防止同样的公司被添加到结果中,但一次又一次地失败了。我不记得具体的错误,但是按照您的思路,您可以在这种查询中这样做。