T SQL рекурсия - PullRequest
       22

T SQL рекурсия

1 голос
/ 14 января 2011

Привет, моя таблица выглядит примерно так.

OldPart | NewPart | Demand
==========================
   C    |    D    |   3
   F    |         |   1
   A    |    B    |   5
   D    |    E    |   2
   E    |    F    |   0
   B    |    C    |   3
   Z    |         |   1
   M    |         |   7
   Y    |    Z    |   10

Я пытаюсь создать финальную таблицу, в которой спрос на новейшие детали агрегируется, а спрос на детали до его изменениядо 0.

Итак, моя таблица будет выглядеть примерно так:

OldPart | NewPart | Demand
==========================
   C    |    D    |   0
   F    |         |   14
   A    |    B    |   0
   D    |    E    |   0
   E    |    F    |   0
   B    |    C    |   0
   Z    |         |   11
   M    |         |   7
   Y    |    Z    |   0

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 14 января 2011

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

Но ... если вы действительно хотите рекурсивное решение ... что-то вроде этого может работать. (хотя это не супер эффективно)

Имейте в виду, петли и тому подобное могут бросить это в ход.

with recurse as (
    select * from #t
    union all
    select t2.OldPart, t2.NewPart, t.Demand + t2.Demand as Demand from recurse t
    join #t t2 on t.NewPart = t2.OldPart
)


select * from (
select OldPart, '' NewPart ,MAX(Demand) Demand from recurse
where OldPart in (select OldPart from #t where NewPart = '')
group by OldPart 
) X 
union all 
select distinct OldPart, NewPart, 0 
from #t 
where NewPart <> ''

Результаты:

 
F       14
M       7
Z       11
A   B   0
B   C   0
C   D   0
D   E   0
E   F   0
Y   Z   0

Ввод:

create table #t (OldPart varchar, NewPart varchar, Demand int) 

go 

insert #t 
select
   'C'   ,  'D'     , 3
  union all
select
   'F'     ,   ''     ,  1
  union all
select
   'A'     ,   'B'    ,  5
  union all
select
   'D'     ,   'E'    ,  2
   union all
select
   'E'     ,   'F'    ,  0

  union all
select
   'B'    ,    'C'    ,  3

  union all
select
   'Z'    ,    ''    ,   1
   union all
select
   'M'    ,   ''     ,   7
  union all
select
   'Y'    ,    'Z'   ,   10
0 голосов
/ 14 января 2011

Чтобы получить таблицу, которую вы описываете:

SELECT OldPart
     , null   as newPart
     , (Select sum(demand)
          from myTable
         where newPart is not null
       ) as Demand
  from myTable
 where newPart is null
 UNION ALL
select oldPart,newpart,0
  from myTable
 where newPart is not null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...