0

私は大規模な多国籍企業を扱っています。子会社の所有権を示すテーブル (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 つは所有割合を示します)。

当分の間、トラック レベルにフィールドを追加し、数レベル後に任意に停止することで問題を解決しました。しかし、レベルの最大数がわからないので、これは私には不親切です。

これを一般的に行う方法はありますか?

ありがとう、タマル

4

2 に答える 2

1

コメント投稿者に感謝します。彼らは私に戻ってデータをもっと詳しく見てもらいました。実際、データにエラーがあり、それが無限の再帰につながりました。データを修正し、クエリは正常に機能しました。

于 2011-05-06T21:01:46.920 に答える
0

OPTION ステートメントを追加して、違いがあるかどうかを確認します。これにより、再帰のレベルが 32K に増加します。

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

CompanyHierarchy 順序から 1、2、3 オプション (maxrecursion 0)

于 2014-03-28T16:17:55.207 に答える