困扰很久的一个问题:请问各位大侠,怎样将如下形式的BOM表只显示最底层,谢谢

wongwhb 2011-08-10 09:13:18

困扰很久的一个问题,请问各位大侠,怎样将如下形式的BOM表只显示最底层,谢谢

Create Table Mutidata2 (
FIndex int ,Fitemid INT, Fitemtype int, fbomlevel int ,fparentid int ,
FLevelString varchar(200),Fnumber varchar(200),Fname varchar(200),Funitid varchar(200),FQty decimal(28,14) default(0) null)

insert into Mutidata2 values( 50,28776,2,0,0, '0', '126-174355275', 'CABLE ASSY', 'pcs(个)', 1)
insert into Mutidata2 values(49,23082, 2, 1, 1, '0.1','126-174355205', 'Cable Assembly', 'pcs(个)', 1)
insert into Mutidata2 values(48, 22565, 1, 2, 2, '..2', 'TSLT-162017600', 'H.S.T', 'M(米)', 0.018)
insert into Mutidata2 values(47,22913, 1, 2, 2, '..2', 'TSLT-210077501', 'UNPLATED-PELTOLA', 'pcs(个)', 1)
insert into Mutidata2 values( 38, 23509, 2, 2, 2, '..2', 'CIT-T174470366', 'CABLE', 'M(米)', 0.044)
insert into Mutidata2 values(37, 22916, 1, 3, 13, '...3', 'TSLT-176027200', 'XXXXXXXXXXXXX', 'KG(公斤)', 0.00008184)
insert into Mutidata2 values( 36, 14561, 1, 3, 13, '...3', 'TSLT-252018300', 'RC COLOR CONCENTRATE FOR PVC-BLACK', 'KG(公斤)', 0.000022)
insert into Mutidata2 values( 27, 30059, 2, 2, 2, '..2', 'CIT-T175175805', 'round cable', 'M(米)', 2.266)
insert into Mutidata2 values( 26, 22629, 2, 3, 18,'...3', 'TSLT-175102008', '0.065-50-FLEXIBLE-NO JACKET', 'M(米)', 5.665)
insert into Mutidata2 values( 25, 22631, 3, 4, 29, '....4','TSLT-178172367', 'X', 'M(米)', 5.665)
insert into Mutidata2 values( 24, 22632, 2, 5, 40, '.....5','TSLT-178172366', 'X', 'M(米)', 5.665)
insert into Mutidata2 values( 23, 22552, 1, 6, 42, '......6','TSLT-176020700', 'SC', 'KG(公斤)', 0.0028325)
insert into Mutidata2 values( 22, 22553, 1, 6, 42, '......6', 'TSLT-255007100','SC','KG(公斤)', 0.0028325)
insert into Mutidata2 values( 21, 22554, 1, 4, 29, '....4','TSLT-176024900', 'SC', 'KG(公斤)', 0.036822)
insert into Mutidata2 values( 20, 22550, 1, 3, 18, '...3', 'TSLT-176203266', 'WIRE', 'KG(公斤)', 0.0463397)
insert into Mutidata2 values( 10, 22920, 1, 2, 2, '..2', 'TSLT-878007000', 'ECB FILTER BOARD (890-0630-0)', 'pcs(个)', 1)
select * from Mutidata2
drop table Mutidata2
...全文
70 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
AcHerat 2011-08-10
  • 打赏
  • 举报
回复
楼主先把你测试数据搞正确,再将结果贴下。
wongwhb 2011-08-10
  • 打赏
  • 举报
回复
各们兄好,我不是展开父节点下所有的子节点,而是展开父节点下最底层的子节点
--小F-- 2011-08-10
  • 打赏
  • 举报
回复
-->Title:Generating test data
-->Author:wufeng4552
-->Date :2009-09-30 08:52:38
set nocount on
if object_id('tb','U')is not null drop table tb
go
create table tb(ID int, ParentID int)
insert into tb select 1,0
insert into tb select 2,1
insert into tb select 3,1
insert into tb select 4,2
insert into tb select 5,3
insert into tb select 6,5
insert into tb select 7,6
-->Title:查找指定節點下的子結點
if object_id('Uf_GetChildID')is not null drop function Uf_GetChildID
go
create function Uf_GetChildID(@ParentID int)
returns @t table(ID int)
as
begin
insert @t select ID from tb where ParentID=@ParentID
while @@rowcount<>0
begin
insert @t select a.ID from tb a inner join @t b
on a.ParentID=b.id and
not exists(select 1 from @t where id=a.id)
end
return
end
go
select * from dbo.Uf_GetChildID(5)
/*
ID
-----------
6
7
*/
-->Title:查找指定節點的所有父結點
if object_id('Uf_GetParentID')is not null drop function Uf_GetParentID
go
create function Uf_GetParentID(@ID int)
returns @t table(ParentID int)
as
begin
insert @t select ParentID from tb where ID=@ID
while @@rowcount!=0
begin
insert @t select a.ParentID from tb a inner join @t b
on a.id=b.ParentID and
not exists(select 1 from @t where ParentID=a.ParentID)
end
return
end
go
select * from dbo.Uf_GetParentID(2)
/*
ParentID
-----------
1
0
*/



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wufeng4552/archive/2009/09/30/4619995.aspx
AcHerat 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wongwhb 的回复:]
fbomlevel是父级的,fparentid是子级的,这个函数应该怎样写啊?能否给个相关的实例,谢谢
[/Quote]

楼主这有问题吧!父级和子级的居然有相同的?

哪个是代表自己这条记录的id,哪个又是表示它所属父级的id

例如一个表tb(id,parentid)

id是这条记录自己本身的id,而parentid表示这条记录所属父级的id

测试数据类似4楼给的。
wongwhb 2011-08-10
  • 打赏
  • 举报
回复
这个只是获取最底层的,如果查所有的,还要如一个查询?
-狙击手- 2011-08-10
  • 打赏
  • 举报
回复
--生成测试数据
create table BOM(ID INT,PID INT,MSG VARCHAR(1000))
insert into BOM select 1,0,NULL
insert into BOM select 2,1,NULL
insert into BOM select 3,1,NULL
insert into BOM select 4,2,NULL
insert into BOM select 5,3,NULL
insert into BOM select 6,5,NULL
insert into BOM select 7,6,NULL
go

--创建用户定义函数用于取每个父节点下子节点的采购配置信息
create function f_getChild(@ID VARCHAR(10))
returns @t table(ID VARCHAR(10),PID VARCHAR(10),Level INT)
as
begin
declare @i int
set @i = 1
insert into @t select ID,PID,@i from BOM where PID = @ID

while @@rowcount<>0
begin
set @i = @i + 1

insert into @t
select
a.ID,a.PID,@i
from
BOM a,@t b
where
a.PID=b.ID and b.Level = @i-1
end
return
end
go

--执行查询
select ID from dbo.f_getChild(3)
go

--输出结果
/*
ID
----
5
6
7
*/

--删除测试数据
drop function f_getChild
drop table BOM
wongwhb 2011-08-10
  • 打赏
  • 举报
回复
fbomlevel是父级的,fparentid是子级的,这个函数应该怎样写啊?能否给个相关的实例,谢谢
AcHerat 2011-08-10
  • 打赏
  • 举报
回复
你这表哪个是自己的id哪个是父级id呀!
AcHerat 2011-08-10
  • 打赏
  • 举报
回复
写一个函数,获取每个bomID的子级层数,然后做个子查询,找到子级层数是0的或者为NULL的。

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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