求各位大哥帮我看看这个语句怎么弄
现在有一个产品表 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 1000
3200 1200
3200 1300
3200 1400
*/
drop function f_getChild
drop table BOM
go
[解决办法]
--创建测试环境
create table #t(产品编码 int,组件编码 int)
--插入测试数据
insert #t(产品编码,组件编码)
select '30232349 ', '231500061 ' union all
select '30232349 ', '1201001 ' union all
select '231500061 ', '221100041 ' union all
select '221100041 ', '221200521 ' union all
select '221200521 ', '221100421 ' union all
select '221100421 ', '211100011 ' union all
select '1 ', '2 ' union all
select '2 ', '3 '
--求解过程
declare @level int set @level = 1
select *,@level as level
into #tmp
from #t where 产品编码 not in(select 组件编码 from #t)
while @@rowcount > 0
begin
set @level = @level + 1
insert #tmp
select _t.产品编码,t.组件编码,@level
from #t t
join #tmp _t on _t.组件编码 = t.产品编码
where _t.level = @level - 1
end
select 产品编码,组件编码
from #tmp t
where 组件编码 not in (select 产品编码 from #t)
/*--测试结果
产品编码 组件编码
----------- -----------
1 3
30232349 1201001
30232349 211100011
*/
--删除测试环境
drop table #t,#tmp