+ -
当前位置:首页 → 问答吧 → 请教一个关于产品子结构的SQL语句

请教一个关于产品子结构的SQL语句

时间:2011-12-13

来源:互联网

有一个这样的产品结构:
支架1 由 材料1 + 材料2 组成
支架2 由 材料1 + 材料3 组成
支架3 由 支架1+材料4 组成
这样的一个产品结构,类似BOM,
建表SQL如下:
SQL code

CREATE TABLE [dbo].[boms] (
    piID varchar(20),  --父ID
    picID varchar(20)  --子ID
)
GO

insert into boms(piID,picID) values('001','0011')
insert into boms(piID,picID) values('001','0012')
insert into boms(piID,picID) values('0012','0013')
insert into boms(piID,picID) values('0012','0014')
insert into boms(piID,picID) values('0013','00133')
insert into boms(piID,picID) values('0013','00134')
insert into boms(piID,picID) values('00133','001331')
insert into boms(piID,picID) values('00133','001332')
go

--通过以下函数可以实现查询下级的编码:
create function f_getP(@piID varchar(20)) 
returns @re table(picID varchar(20),lev int,piID varchar(20),TFlag varchar(10)) 
as
begin
    declare @l int 
    set @l=0 
    insert @re select picID,@l,piID,'本级ID' from [boms] where piID = @piID
    while @@rowcount>0 
    begin 
        set @l=@l+1
        insert @re select a.picID,@l,a.piID,'下级ID'
        from [boms] a,@re b
        where a.piID=b.picID and b.lev=@l-1 and a.picID is not null
    end 
    update @re set lev=@l-lev
    return
end
go

declare @piID varchar(10)
set @piID = '001'

select * from dbo.f_getP(@piID)






==
现在的问题是,表中增加了一个数量字段,
支架1 由 2个材料1 + 3个材料2 组成
支架2 由 3个材料1 + 5个材料3 组成
支架3 由 4个支架1+1个材料4 组成

假如现在需要5个支架3,则计算需要:
5×4个支架1 
5×1个材料4
--
5×4×2个材料1
5×4×3个材料2

想要这样的结果,函数该如何修改一下呢?谢谢

作者: yumanqing   发布时间: 2011-12-13

改动的大了,

二维和三维的区别,不仅仅是一点点哦.

作者: liuqian4243   发布时间: 2011-12-13

那该如何改呢,谢谢,在线等

作者: yumanqing   发布时间: 2011-12-13

我感觉你这个需要用程序来做.
第一步先求出支架3的情况,然后判断支架3中是否存在支架1或支架2
第二步再求出支架1或支架2的情况...
如此循环...知道求出的内容中不含有支架1.2.3...或者说求出的内容中在支架那个字段中不存在才结束.

作者: dawugui   发布时间: 2011-12-13

感觉是一个BOM路径的问题

作者: fredrickhu   发布时间: 2011-12-13

感谢dawugui
 
(爱新觉罗.毓华) 
,程序代码是能写出来,递归循环,但觉得有些复杂,如果能借助数据库方便的统计出来,我想可能简单一些

作者: yumanqing   发布时间: 2011-12-13

热门下载

更多