SQL Server 2008: рекурсивный запрос, где иерархия не является строгой - PullRequest
0 голосов
/ 02 мая 2011

Я имею дело с большой многонациональной корпорацией. У меня есть таблица (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

Ошибка с сообщением 530: «Максимальная рекурсия 100 исчерпана до завершения оператора.»

Я считаю, что проблема в том, что отношения в таблице не являются строго иерархическими. В частности, одна дочерняя компания может принадлежать более чем одной компании, и вы даже можете иметь ситуацию, когда A владеет B и частью C, а B также владеет частью C. (Одно из других полей указывает процент владения.)

В настоящее время я решил проблему, добавив поле для отслеживания уровня и произвольно остановившись после нескольких уровней. Но мне это кажется глупым, поскольку я не могу быть уверенным в максимальном количестве уровней.

Есть идеи, как это сделать в общем?

Спасибо, Тамар

Ответы [ 2 ]

1 голос
/ 07 мая 2011

Спасибо комментаторам.Они заставили меня вернуться и присмотреться к данным.На самом деле были ошибки в данных, которые привели к бесконечной рекурсии.Исправил данные и запрос работал нормально.

0 голосов
/ 28 марта 2014

Добавьте оператор OPTION и посмотрите, будет ли он иметь значение. Это увеличит уровни рекурсии до 32K

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

от CompanyHierarchy заказ на 1, 2, 3 опция (maxrecursion 0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...