简单的递归算法

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

PARENT(成品) ITEM_CODE(半成品或物料) BOM_UNIT
99-88551-01030 97-88551-01030 PCS ----此为最高层
97-88551-01030 96-88551-01010 PCS
96-88551-01010 #8003042-01010 G
96-88551-01010 #6300035-01010 G
96-88551-01010 20-88551-01030 PCS
20-88551-01030 21-00001-00010 G
20-88551-01030 22-00424-01010 G

98485-00001 97485-00001 PCS ----此为最高层
97485-00001 90485-00001 PCS
90485-00001 #8000-01010 G
90485-00001 20485-00001 PCS
20485-00001 21485-00001 PCS
20485-00001 22485-00001 G

98-78496-SP417K #98-78496-SP417K G ----此为最高层
98-78496-SP417K 97-78496-SP417K PCS
97-78496-SP417K 96-78496-SP2027 PCS
97-78496-SP417K #7678496-00010 G
97-78496-SP417K #88-78496-SP2027 G
96-78496-SP2027 94-78496-SP2027 PCS
96-78496-SP2027 #87-78496-SP2027 G
94-78496-SP2027 90-78496-01010 PCS
90-78496-01010 87-02029-00020 G
90-78496-01010 02-00002-01011 G

我想要的结果是:
1.当输入某个PARENT最高层号码比如98-78496-SP417K,得到它下面所有层次的记录:

98-78496-SP417K #98-78496-SP417K G
98-78496-SP417K 97-78496-SP417K PCS
97-78496-SP417K 96-78496-SP2027 PCS
97-78496-SP417K #7678496-00010 G
97-78496-SP417K #88-78496-SP2027 G
96-78496-SP2027 94-78496-SP2027 PCS
96-78496-SP2027 #87-78496-SP2027 G
94-78496-SP2027 90-78496-01010 PCS
90-78496-01010 87-02029-00020 G
90-78496-01010 02-00002-01011 G

同时将结果插入到一个表tb中,tb表的格式与BOM1一样。
数据库环境: SQL 2000
...全文
231 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
amdnemo 2012-06-15
  • 打赏
  • 举报
回复
看不到
wangxiaofeiwuqiao 2011-11-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 roy_88 的回复:]
引用 10 楼 wangxiaofeiwuqiao 的回复:
引用 8 楼 roy_88 的回复:
樓主是SQL2000吧?
用以上方法測測看

可以,还有个问题,我怎么将结果写入另外的一个表TB 中呢?

在这一段前面加

INSERT INTO TB SELECT PARENT,ITEM_CODE,BOM_UNIT FROM #B ORDER BY lev
[/Quote]
试过了,可以。结贴
中国风 2011-11-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wangxiaofeiwuqiao 的回复:]
引用 8 楼 roy_88 的回复:
樓主是SQL2000吧?
用以上方法測測看

可以,还有个问题,我怎么将结果写入另外的一个表TB 中呢?
[/Quote]
在这一段前面加

INSERT INTO TB SELECT PARENT,ITEM_CODE,BOM_UNIT FROM #B ORDER BY lev

wangxiaofeiwuqiao 2011-11-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 acherat 的回复:]
引用 5 楼 wangxiaofeiwuqiao 的回复:
引用 3 楼 fredrickhu 的回复:
好长啊 先MRAK 开会了回来看。

那是测试数据多,其实逻辑是比较单一的。只是我是菜菜。


这个不是之前写了很多了么!看看应该能写出来的,就是逻辑问题了。
[/Quote]
呵呵,小三,这个的模式跟以前的有点不一样,以前的都是拆分底层
wangxiaofeiwuqiao 2011-11-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 roy_88 的回复:]
樓主是SQL2000吧?
用以上方法測測看
[/Quote]
可以,还有个问题,我怎么将结果写入另外的一个表TB 中呢?
AcHerat 元老 2011-11-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wangxiaofeiwuqiao 的回复:]
引用 3 楼 fredrickhu 的回复:
好长啊 先MRAK 开会了回来看。

那是测试数据多,其实逻辑是比较单一的。只是我是菜菜。
[/Quote]

这个不是之前写了很多了么!看看应该能写出来的,就是逻辑问题了。
中国风 2011-11-11
  • 打赏
  • 举报
回复
樓主是SQL2000吧?
用以上方法測測看
中国风 2011-11-11
  • 打赏
  • 举报
回复
create table BOM1(PARENT varchar(50),ITEM_CODE varchar(50),BOM_UNIT varchar(50))

insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('99-88551-01030','97-88551-01030','PCS')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('97-88551-01030','96-88551-01010','PCS')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('96-88551-01010','#8003042-01010','G')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('96-88551-01010','#6300035-01010','G')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('96-88551-01010','20-88551-01030','PCS')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('20-88551-01030','21-00001-00010','G')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('20-88551-01030','22-00424-01010','G')

insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('98-78496-SP417K','#98-78496-SP417K','G')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('98-78496-SP417K','97-78496-SP417K','PCS')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('97-78496-SP417K','96-78496-SP2027','PCS')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('97-78496-SP417K','#7678496-00010','G')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('97-78496-SP417K','#88-78496-SP2027','G')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('96-78496-SP2027','94-78496-SP2027','PCS')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('96-78496-SP2027','#87-78496-SP2027','G')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('94-78496-SP2027','90-78496-01010','PCS')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('90-78496-01010','87-02029-00020','G')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('90-78496-01010','02-00002-01011','G')



insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('98485-00001','97485-00001','PCS')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('97485-00001','90485-00001','PCS')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('90485-00001','#8000-01010','PCS')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('90485-00001','20485-00001','PCS')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('20485-00001','21485-00001','G')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('20485-00001','22485-00001','G')
GO

DECLARE @PARENT NVARCHAR(50)
SET @PARENT='98-78496-SP417K'

DECLARE @lev INT
SET @lev=0

IF OBJECT_ID('Tempdb..#B') IS NOT NULL
DROP TABLE #B
SELECT * ,lev=0 INTO #B FROM BOM1 WHERE PARENT=@PARENT

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

END
SELECT PARENT,ITEM_CODE,BOM_UNIT FROM #B ORDER BY lev

/*
PARENT ITEM_CODE BOM_UNIT
98-78496-SP417K #98-78496-SP417K G
98-78496-SP417K 97-78496-SP417K PCS
97-78496-SP417K 96-78496-SP2027 PCS
97-78496-SP417K #7678496-00010 G
97-78496-SP417K #88-78496-SP2027 G
96-78496-SP2027 94-78496-SP2027 PCS
96-78496-SP2027 #87-78496-SP2027 G
94-78496-SP2027 90-78496-01010 PCS
90-78496-01010 87-02029-00020 G
90-78496-01010 02-00002-01011 G*/
pengxuan 2011-11-11
  • 打赏
  • 举报
回复
哪个字段代表上下级关系呢
wangxiaofeiwuqiao 2011-11-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fredrickhu 的回复:]
好长啊 先MRAK 开会了回来看。
[/Quote]
那是测试数据多,其实逻辑是比较单一的。只是我是菜菜。
稻草_木偶 2011-11-11
  • 打赏
  • 举报
回复
mark个~等楼下
--小F-- 2011-11-11
  • 打赏
  • 举报
回复
好长啊 先MRAK 开会了回来看。
苦苦的潜行者 2011-11-11
  • 打赏
  • 举报
回复
wangxiaofeiwuqiao 2011-11-11
  • 打赏
  • 举报
回复
测试数据:

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

insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('99-88551-01030','97-88551-01030','PCS')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('97-88551-01030','96-88551-01010','PCS')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('96-88551-01010','#8003042-01010','G')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('96-88551-01010','#6300035-01010','G')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('96-88551-01010','20-88551-01030','PCS')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('20-88551-01030','21-00001-00010','G')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('20-88551-01030','22-00424-01010','G')

insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('98-78496-SP417K','#98-78496-SP417K','G')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('98-78496-SP417K','97-78496-SP417K','PCS')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('97-78496-SP417K','96-78496-SP2027','PCS')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('97-78496-SP417K','#7678496-00010','G')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('97-78496-SP417K','#88-78496-SP2027','G')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('96-78496-SP2027','94-78496-SP2027','PCS')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('96-78496-SP2027','#87-78496-SP2027','G')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('94-78496-SP2027','90-78496-01010','PCS')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('90-78496-01010','87-02029-00020','G')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('90-78496-01010','02-00002-01011','G')



insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('98485-00001','97485-00001','PCS')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('97485-00001','90485-00001','PCS')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('90485-00001','#8000-01010','PCS')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('90485-00001','20485-00001','PCS')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('20485-00001','21485-00001','G')
insert into BOM1(PARENT,ITEM_CODE,BOM_UNIT)
values('20485-00001','22485-00001','G')

34,587

社区成员

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

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