首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

求帮小弟我看看这个语句如何弄

2012-02-17 
求各位大哥帮我看看这个语句怎么弄现在有一个产品表BOM如下:产品编码组件编码300020003000100030002100。。。

求各位大哥帮我看看这个语句怎么弄
现在有一个产品表   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

热点排行