簡體   English   中英

SQL Server 2008:層次結構不嚴格的遞歸查詢

[英]SQL Server 2008: Recursive query where hierarchy isn't strict

我正在與一家大型跨國公司打交道。 我有一張表(oldtir),顯示子公司的所有權。 此問題的字段是:

  • cID - 此表的 PK
  • dpm_sub - 子公司的 FK
  • dpm_pco - 母公司的 FK
  • year - 這是關系所在的年份(因為它們會隨着時間而變化)

還有其他字段,但與此問題無關。 (請注意,沒有專門指明頂級公司的記錄,因此我們必須通過讓它們不顯示為子公司來確定它們是什么。)

我寫了下面的查詢:

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的一部分的情況。 (其他字段之一表示所有權百分比。)

暫時我已經解決了這個問題,在track level中加了一個field,過了幾個level就隨意停了。 但這對我來說感覺很笨拙,因為我無法確定最大級別數。

任何想法如何一般地做到這一點?

謝謝,添馬艦

感謝評論者。 他們讓我返回 go 並更仔細地查看數據。 事實上,數據中存在錯誤,導致無限遞歸。 修復了數據,查詢工作得很好。

添加 OPTION 語句,看看它是否有所作為。 這會將遞歸級別增加到 32K

select distinct CompanyHierarchy.[Year], 
   CompanyHierarchy.[dpm_pco], 
   CompanyHierarchy.dpm_sub, 

從 CompanyHierarchy 按 1、2、3 選項排序(maxrecursion 0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM