修改一下递归存储过程,思路简单!

wangxiaofeiwuqiao 2012-05-23 03:59:22
原帖:http://topic.csdn.net/u/20120508/09/dc2dfeb1-6275-42d5-9446-d7c6680c6bc2.html答案见6楼。测试数据一样,只是要求的答案略有不同。
有表tb1:(ITEM_CODE指成品)
ITEM_CODE
99-88551-01030
#98-78496-SP417K
......

有表BOM1:
其中PARENT与ITEM_CODE可以存在不定的多层的递归关系,层层递归,99下面是98,98下是97,97下是94,94下是91,91下面是20或者21,22等等。例如:

PARENT(成品) ITEM_CODE(半成品或物料) SHW_QTY(用量) BOM_UNIT(单位)
99-88551-01030 97-88551-01030 2 PCS ----此为最高层
97-88551-01030 96-88551-01010 1 PCS
96-88551-01010 #8003042-01010 1.5 G
96-88551-01010 #6300035-01010 3 G
96-88551-01010 20-88551-01030 2.2 PCS
96-88551-01010 90-88551-01030 2.2 PCS
90-88551-01030 21-00001-00010 1.5 G
90-88551-01030 22-00424-01010 2.5 G
20-88551-01030 21-00001-00010 4.5 G
20-88551-01030 22-00424-01010 2 G

98485-00001 97485-00001 5 PCS ----此为最高层
97485-00001 90485-00001 4 PCS
90485-00001 #8000-01010 2 G
90485-00001 20485-00001 1.5 PCS
20485-00001 21485-00001 2 PCS
20485-00001 22485-00001 3 G

#98-78496-SP417K 97-78496-SP417K 5.2 PCS ----此为最高层
97-78496-SP417K 96-78496-SP2027 6 PCS
97-78496-SP417K #7678496-00010 5 G
97-78496-SP417K #88-78496-SP2027 4 G
96-78496-SP2027 94-78496-SP2027 1 PCS
96-78496-SP2027 #87-78496-SP2027 6 G
94-78496-SP2027 90-78496-01010 2.2 PCS
90-78496-01010 87-02029-00020 3.5 G
90-78496-01010 02-00002-01011 1 G

我想要的结果:通过查找成品表tb1中的所有成品,找出它们下面的所有物料和半成品,包含显示用量和单位.
与原帖不同的是,中间的半成品不需要显示,只需要显示最低物料即可。如成品99-88551-01030,中间物料97-88551-01030,96-88551-01010等都不要显示。
我要的答案:

ITEM_CODE PARENT SHW_QTY BOM_UNIT
#8003042-01010 99-88551-01030 1.5 G
#6300035-01010 99-88551-01030 3 G
21-00001-00010 99-88551-01030 1.5 G
22-00424-01010 99-88551-01030 2.5 G
21-00001-00010 99-88551-01030 4.5 G
22-00424-01010 99-88551-01030 2 G

#7678496-00010 98-78496-SP417K 5 G
#88-78496-SP2027 98-78496-SP417K 4 G
#87-78496-SP2027 98-78496-SP417K 6 G
87-02029-00020 98-78496-SP417K 3.5 G
02-00002-01011 98-78496-SP417K 1 G


数据库环境: SQL 2000
...全文
151 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐诗三百首 2012-05-23
  • 打赏
  • 举报
回复

create table BOM1(PARENT varchar(50),
ITEM_CODE varchar(50),SHW_QTY FLOAT,BOM_UNIT varchar(50))

insert into BOM1(PARENT,ITEM_CODE,SHW_QTY,BOM_UNIT)
SELECT '99-88551-01030','97-88551-01030','2','PCS' UNION ALL
SELECT '97-88551-01030','96-88551-01010','1','PCS' UNION ALL
SELECT '96-88551-01010','#8003042-01010','1.5','G' UNION ALL
SELECT '96-88551-01010','#6300035-01010','3','G' UNION ALL
SELECT '96-88551-01010','20-88551-01030','2.2','PCS' UNION ALL
SELECT '96-88551-01010','90-88551-01030','2.2','PCS' UNION ALL
SELECT '90-88551-01030','21-00001-00010','1.5','G' UNION ALL
SELECT '90-88551-01030','22-00424-01010','2.5','G' UNION ALL
SELECT '20-88551-01030','21-00001-00010','4.5','G' UNION ALL
SELECT '20-88551-01030','22-00424-01010','2','G' UNION ALL
SELECT '#98-78496-SP417K','97-78496-SP417K','5.2','PCS' UNION ALL
SELECT '97-78496-SP417K','96-78496-SP2027','6','PCS' UNION ALL
SELECT '97-78496-SP417K','#7678496-00010','5','G' UNION ALL
SELECT '97-78496-SP417K','#88-78496-SP2027','4','G' UNION ALL
SELECT '96-78496-SP2027','94-78496-SP2027','1','PCS' UNION ALL
SELECT '96-78496-SP2027','#87-78496-SP2027','6','G' UNION ALL
SELECT '94-78496-SP2027','90-78496-01010','2.2','PCS' UNION ALL
SELECT '90-78496-01010','87-02029-00020','3.5','G' UNION ALL
SELECT '90-78496-01010','02-00002-01011','1','G' UNION ALL
SELECT '98485-00001','97485-00001','5','PCS' UNION ALL
SELECT '97485-00001','90485-00001','4','PCS' UNION ALL
SELECT '90485-00001','#8000-01010','2','PCS' UNION ALL
SELECT '90485-00001','20485-00001','1.5','PCS' UNION ALL
SELECT '20485-00001','21485-00001','2','G' UNION ALL
SELECT '20485-00001','22485-00001','3','G'

create table tb1(ITEM_CODE varchar(50))

insert into tb1 values('99-88551-01030')
insert into tb1 values('#98-78496-SP417K')


DECLARE @lev INT
SET @lev=0

SELECT t.*,lev=0,t.PARENT AS PG
INTO #B
FROM BOM1 t join tb1 e on t.PARENT = e.ITEM_CODE

WHILE @@rowcount>0
BEGIN
SET @lev=@lev+1
INSERT INTO #B
SELECT a.*,lev=b.lev+1,b.PG
FROM BOM1 AS a
INNER JOIN #B AS b
on b.ITEM_CODE=a.PARENT AND b.lev=@lev-1
END


select t.ITEM_CODE,t.PARENT,t.SHW_QTY,t.BOM_UNIT
from
(SELECT ITEM_CODE,PG 'PARENT',SHW_QTY,BOM_UNIT,lev
FROM #B) t
left join BOM1 b
on t.ITEM_CODE=b.PARENT
where b.PARENT is null
order by t.PARENT desc,t.lev

/*
ITEM_CODE PARENT SHW_QTY BOM_UNIT
-------------------- -------------------- ---------------------- ------------
#8003042-01010 99-88551-01030 1.5 G
#6300035-01010 99-88551-01030 3 G
21-00001-00010 99-88551-01030 1.5 G
22-00424-01010 99-88551-01030 2.5 G
21-00001-00010 99-88551-01030 4.5 G
22-00424-01010 99-88551-01030 2 G
#7678496-00010 #98-78496-SP417K 5 G
#88-78496-SP2027 #98-78496-SP417K 4 G
#87-78496-SP2027 #98-78496-SP417K 6 G
87-02029-00020 #98-78496-SP417K 3.5 G
02-00002-01011 #98-78496-SP417K 1 G

(11 row(s) affected)
*/
wangxiaofeiwuqiao 2012-05-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
SQL code

create table BOM1(PARENT varchar(50),
ITEM_CODE varchar(50),SHW_QTY FLOAT,BOM_UNIT varchar(50))

insert into BOM1(PARENT,ITEM_CODE,SHW_QTY,BOM_UNIT)
SELECT '99-88551-01030','97-88551-……
[/Quote]
不能以"G"作为判断条件。单位我是乱写的。需从递归入手。
  • 打赏
  • 举报
回复

create table BOM1(PARENT varchar(50),
ITEM_CODE varchar(50),SHW_QTY FLOAT,BOM_UNIT varchar(50))

insert into BOM1(PARENT,ITEM_CODE,SHW_QTY,BOM_UNIT)
SELECT '99-88551-01030','97-88551-01030','2','PCS' UNION ALL
SELECT '97-88551-01030','96-88551-01010','1','PCS' UNION ALL
SELECT '96-88551-01010','#8003042-01010','1.5','G' UNION ALL
SELECT '96-88551-01010','#6300035-01010','3','G' UNION ALL
SELECT '96-88551-01010','20-88551-01030','2.2','PCS' UNION ALL
SELECT '96-88551-01010','90-88551-01030','2.2','PCS' UNION ALL
SELECT '90-88551-01030','21-00001-00010','1.5','G' UNION ALL
SELECT '90-88551-01030','22-00424-01010','2.5','G' UNION ALL
SELECT '20-88551-01030','21-00001-00010','4.5','G' UNION ALL
SELECT '20-88551-01030','22-00424-01010','2','G' UNION ALL

SELECT '#98-78496-SP417K','97-78496-SP417K','5.2','PCS' UNION ALL
SELECT '97-78496-SP417K','96-78496-SP2027','6','PCS' UNION ALL
SELECT '97-78496-SP417K','#7678496-00010','5','G' UNION ALL
SELECT '97-78496-SP417K','#88-78496-SP2027','4','G' UNION ALL
SELECT '96-78496-SP2027','94-78496-SP2027','1','PCS' UNION ALL
SELECT '96-78496-SP2027','#87-78496-SP2027','6','G' UNION ALL
SELECT '94-78496-SP2027','90-78496-01010','2.2','PCS' UNION ALL
SELECT '90-78496-01010','87-02029-00020','3.5','G' UNION ALL
SELECT '90-78496-01010','02-00002-01011','1','G' UNION ALL

SELECT '98485-00001','97485-00001','5','PCS' UNION ALL
SELECT '97485-00001','90485-00001','4','PCS' UNION ALL
SELECT '90485-00001','#8000-01010','2','PCS' UNION ALL
SELECT '90485-00001','20485-00001','1.5','PCS' UNION ALL
SELECT '20485-00001','21485-00001','2','G' UNION ALL
SELECT '20485-00001','22485-00001','3','G'

create table tb1(ITEM_CODE varchar(50))

insert into tb1 values('99-88551-01030')
insert into tb1 values('#98-78496-SP417K')


DECLARE @lev INT
SET @lev=0

--drop table #B
SELECT t.*,lev=0,t.PARENT AS PG
INTO #B
FROM BOM1 t join tb1 e on t.PARENT = e.ITEM_CODE

WHILE @@rowcount>0
BEGIN
SET @lev=@lev+1
INSERT INTO #B
SELECT a.*,lev=b.lev+1,b.PG
FROM BOM1 AS a
INNER JOIN #B AS b
on b.ITEM_CODE=a.PARENT AND b.lev=@lev-1

END


select ITEM_CODE,PARENT,SHW_QTY,BOM_UNIT
from
(SELECT ITEM_CODE,PG 'PARENT',SHW_QTY,BOM_UNIT,lev
FROM #B) t
where BOM_UNIT='G'
order by t.PARENT desc,t.lev

/*
ITEM_CODE PARENT SHW_QTY BOM_UNIT
#8003042-01010 99-88551-01030 1.5 G
#6300035-01010 99-88551-01030 3 G
21-00001-00010 99-88551-01030 1.5 G
22-00424-01010 99-88551-01030 2.5 G
21-00001-00010 99-88551-01030 4.5 G
22-00424-01010 99-88551-01030 2 G
#7678496-00010 #98-78496-SP417K 5 G
#88-78496-SP2027 #98-78496-SP417K 4 G
#87-78496-SP2027 #98-78496-SP417K 6 G
87-02029-00020 #98-78496-SP417K 3.5 G
02-00002-01011 #98-78496-SP417K 1 G
*/
wangxiaofeiwuqiao 2012-05-23
  • 打赏
  • 举报
回复
测试数据见原帖。

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧