私は大規模な多国籍企業を扱っています。子会社の所有権を示すテーブル (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
メッセージ 530 で失敗します:「ステートメントが完了する前に最大再帰 100 を使い果たしました。」
問題は、テーブル内の関係が厳密に階層化されていないことだと思います。具体的には、1 つの子会社を複数の会社が所有することができます。また、A が B と C の一部を所有し、B も C の一部を所有しているという状況さえあり得ます (他のフィールドの 1 つは所有割合を示します)。
当分の間、トラック レベルにフィールドを追加し、数レベル後に任意に停止することで問題を解決しました。しかし、レベルの最大数がわからないので、これは私には不親切です。
これを一般的に行う方法はありますか?
ありがとう、タマル