求各位大哥帮我看看这个语句怎么弄
现在有一个产品表 BOM如下:
产品编码 组件编码
3000 2000
3000 1000
3000 2100
。。。 。。。
2000 1200
2000 1300
。。。 。。。
2100 1300
2100 1500
。。。 。。。。
3200 1100
3200 1230
3200 2200
2200 1340
2200 1370
也就是产品3000 由2000,1000,2100组成,其中2000又由1200,1300组成,2100由1300,1500组成。。可能有很多层的 。2开头可能是叶子 也可能不是
现在希望得到3000的最低层的所有组成,也就是叶
即得到以下结果:
产品 叶组件
3000 1000
3000 1200
3000 1300
3000 1500
。。。 。。。
3200 1100
3200 1230
3200 1340
3200 1370
。。。。。。
也就是 我需要显示BOM表里面所有的产品按上面那样显示出来
请各位大哥们帮一下忙,谢谢大家
------解决方案--------------------create table BOM(PID int,ID int)
insert into BOM select 3000,2000
insert into BOM select 3000,1000
insert into BOM select 3000,2100
insert into BOM select 2000,1200
insert into BOM select 2000,1300
insert into BOM select 2100,1300
insert into BOM select 2100,1500
insert into BOM select 3200,2000
insert into BOM select 3200,1000
insert into BOM select 3200,1400
go
create function f_getChild()
returns @t table(PID int,ID int)
as
begin
declare @t1 table(PID int,MID int,ID int)
insert into @t1(PID,MID,ID)
select
t.PID,t.PID,t.ID
from
BOM t
where
not exists(select 1 from BOM where ID=t.PID)
while @@rowcount <> 0
begin
insert into @t1(PID,MID,ID)
select
b.PID,a.PID,a.ID
from
BOM a,
@t1 b
where
a.PID=b.ID
and
not exists(select 1 from @t1 where MID=a.PID)
end
insert into @t (PID,ID)
select
distinct PID,ID
from
@t1 t
where
not exists (select 1 from @t1 where MID=t.ID)
return
end
go
select * from dbo.f_getChild()
go
/*
PID ID
----------- -----------
3000 1000
3000 1200
3000 1300
3000 1500
3200