K/3 BOM多级展开
2014-03-24 19:44 dsding 阅读(830) 评论(0) 收藏 举报
上图是一个树状BOM,加色部分是原材料。
下图是简单新增的三张表,一个物料表,一个是BOM表头,一个是BOM表体。

再下面是多级查询后的结果,查询分三层,ID为2是自制件,ID为1是外购件。

SQL 脚本如下,可能还有可以改动的地方DECLARE @Level INT SET @Level = 0
CREATE TABLE #GroupData
( FLevel INT NOT NULL,
FItemID varchar NOT NULL,
id char NOT NULL
)
Create Index #idx_parentid on #GroupData(FITEMID)
create TABLE #GROUPDATA1 (FLevel INT NOT NULL,
FItemID varchar NOT NULL,
id char NOT NULL)
insert into #GroupData(FLevel,FItemID,id)
select @Level+1,b.FItemID,c.id from bom a join bomc b on a.fid=b.fid
join base c on b.FItemID=c.FItemID where a.FItemID='a'
while EXISTS (select top 1 1 from (select flevel,fitemid,id from #GROUPDATA
where flevel=(select max(flevel)from #GROUPDATA) and id=2) a left join bom b on a.FItemID=b.FItemID
where b.fitemid is not null)
BEGIN
SET @Level=(SELECT MAX(FLEVEL)FROM #GroupData)
INSERT INTO #GROUPDATA1(FLevel,FItemID,id)
select flevel,fitemid,id from #GROUPDATA where flevel=(select max(flevel)from #GROUPDATA) and id=2
insert into #GroupData(FLevel,FItemID,id)
select @Level+1,b.FItemID,c.id
from #GROUPDATA1 a
left join bom d on a.FItemID=d.FItemID
join bomc b on d.fid=b.fid
left join base c on b.fitemid=c.fitemid
set @Level=@Level+1
TRUNCATE TABLE #GROUPDATA1
END
浙公网安备 33010602011771号