返向展開BOM

zdy_hl 2005-03-28 05:40:31
BOM TABLE
料件編號 子料件
100-A-1 500-A-C
100-A-1 500-A-B
100-A-1 500-A-D
500-A-C 600-A-F
500-A-C 600-A-D
500-A-B 600-D-D
500-A-B 600-D-7
500-A-D 700-F-1
500-A-D 700-F-4
我想要的結果是,填入一個子料號能夠將該料號的所有父階都成找出來.
...全文
103 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
bicfei 2005-03-29
  • 打赏
  • 举报
回复
做生产的真命苦.同情
zjcxc 2005-03-29
  • 打赏
  • 举报
回复
use tempdb
go

--建立测试环境
Create Table 表(料件編號 varchar(10),子料件 varchar(10))
--插入数据
insert into 表
select '100-A-1','500-A-C' union
select '100-A-1','500-A-B' union
select '100-A-1','500-A-D' union
select '500-A-C','600-A-F' union
select '500-A-C','600-A-D' union
select '500-A-B','600-D-D' union
select '500-A-B','600-D-7' union
select '500-A-D','700-F-1' union
select '500-A-D','700-F-4'
--select * from 表
--测试语句
go
create function f_cid(@子料件 varchar(10))
returns @re table(父项 varchar(10),[level] int,sid varchar(8000))
as
begin
declare @l int
set @l=1
insert @re select 料件編號,@l,料件編號
from 表 a
where 子料件=@子料件
while @@rowcount>0
begin
set @l=@l+1
insert @re select a.料件編號,@l,a.料件編號+' -> '+b.sid
from 表 a,@re b
where a.子料件=b.父项 and b.[level]=@l-1
end
update @re set level=@l-level
return
end
go
select * from dbo.f_cid('700-F-4')
go

--删除测试环境
Drop Table 表
drop function f_cid

/*
父项 level sid
---------- ----------- ------------------
500-A-D 2 500-A-D
100-A-1 1 100-A-1 -> 500-A-D

(所影响的行数为 2 行)
*/
zjcxc 2005-03-29
  • 打赏
  • 举报
回复
use tempdb
go

--建立测试环境
Create Table 表(料件編號 varchar(10),子料件 varchar(10))
--插入数据
insert into 表
select '100-A-1','500-A-C' union
select '100-A-1','500-A-B' union
select '100-A-1','500-A-D' union
select '500-A-C','600-A-F' union
select '500-A-C','600-A-D' union
select '500-A-B','600-D-D' union
select '500-A-B','600-D-7' union
select '500-A-D','700-F-1' union
select '500-A-D','700-F-4'
--select * from 表
--测试语句
go
create function f_cid(@子料件 varchar(10))
returns @re table(父项 varchar(10),[level] int,sid varchar(8000))
as
begin
declare @l int
set @l=1
insert @re select 料件編號,@l,料件編號
from 表 a
where 子料件=@子料件
while @@rowcount>0
begin
set @l=@l+1
insert @re select a.料件編號,@l,b.sid+'<'+a.料件編號
from 表 a,@re b
where a.子料件=b.父项 and b.[level]=@l-1
end
return
end
go
select * from dbo.f_cid('700-F-4')
go

--删除测试环境
Drop Table 表
drop function f_cid

/*
父项 level sid
---------- ----------- -----------------
500-A-D 1 500-A-D
100-A-1 2 500-A-D<100-A-1

(所影响的行数为 2 行)

*/
jinjazz 2005-03-28
  • 打赏
  • 举报
回复
--建立测试环境
Create Table 表(料件編號 varchar(10),子料件 varchar(10))
--插入数据
insert into 表
select '100-A-1','500-A-C' union
select '100-A-1','500-A-B' union
select '100-A-1','500-A-D' union
select '500-A-C','600-A-F' union
select '500-A-C','600-A-D' union
select '500-A-B','600-D-D' union
select '500-A-B','600-D-7' union
select '500-A-D','700-F-1' union
select '500-A-D','700-F-4'
--select * from 表
--测试语句
go
create function f_id()
returns @re table(父项 varchar(10),[level] int,sid varchar(8000))
as
begin
declare @l int
set @l=1
insert @re select distinct 子料件,@l,子料件
from 表 a
where not exists(select * from 表 where 料件編號=a.子料件)
while @@rowcount>0
begin
set @l=@l+1
insert @re select a.料件編號,@l,b.sid+'<'+a.料件編號
from 表 a,@re b
where a.子料件=b.父项 and b.[level]=@l-1
end
return
end
go
select 父项 ,level from dbo.f_id() where sid like'600-A-D%'

--删除测试环境
Drop Table 表
drop function f_id

/*
父项 level
---------- -----------
600-A-D 1
500-A-C 2
100-A-1 3
*/

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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