【Transact-SQL】BOM按节点排序

问题是这样的:

CREATE TABLE [dbo].[BOM_Table](
	[Code] [nvarchar](50) NULL,
	[Z_Name] [nvarchar](50) NULL,
	[B_Code] [nvarchar](50) NULL,
	[B_Name] [nvarchar](50) NULL
) ON [PRIMARY]

GO
INSERT INTO BOM_Table(Code,Z_Name,B_Code,B_Name)
VALUES('1001','水龙头','10089','螺丝')
INSERT INTO BOM_Table(Code,Z_Name,B_Code,B_Name)
VALUES('1001','水龙头','10063','水管')
INSERT INTO BOM_Table(Code,Z_Name,B_Code,B_Name)
VALUES('1001','水龙头','10082','扳手')
INSERT INTO BOM_Table(Code,Z_Name,B_Code,B_Name)
VALUES('1001','水龙头','10081','胶带')
INSERT INTO BOM_Table(Code,Z_Name,B_Code,B_Name)
VALUES('10063','水管','102331','塑料')
INSERT INTO BOM_Table(Code,Z_Name,B_Code,B_Name)
VALUES('10063','水管','102303','胶皮')
INSERT INTO BOM_Table(Code,Z_Name,B_Code,B_Name)
VALUES('102303','胶皮','203301','胶水')
INSERT INTO BOM_Table(Code,Z_Name,B_Code,B_Name)
VALUES('102303','胶皮','203302','布料')
INSERT INTO BOM_Table(Code,Z_Name,B_Code,B_Name)
VALUES('10082','扳手','205410','铁柄')
INSERT INTO BOM_Table(Code,Z_Name,B_Code,B_Name)
VALUES('10082','扳手','205418','铁头')

--------结果---------------------------------------------
--格式不限,游标 什么的都可以,只是这只是列举了几条数据而已,深度未知,不一定就是三层或者四层
--希望高手别写死,写死的没啥意思,要活的 动态的  静候各位指点。
---插入一个新表 或者 显示如下格式------

Code	Z_Name	B_Code	B_Name	节点属性
1001	水龙头	10089	螺丝	1
1001	水龙头	10063	水管	1
10063	水管	102331	塑料	1-1
10063	水管	102303	胶皮	1-2
102303	胶皮	203301	胶水	1-2-1
102303	胶皮	203302	布料	1-2-2
1001	水龙头	10082	扳手	1
10082	扳手	205410	铁柄	1-1
10082	扳手	205418	铁头	1-2
1001	水龙头	10081	胶带	1

这个写法,通过not exists找到根节点,然后从根节点开始,向子节点遍历,通过sort字段来排序,而属性字段则是由层次level,加上rownum组合而成:

;with tt 
as 
(
  select *, 
         row_number() over (partition by Code order by getdate()) rownum
  from   [BOM_Table]
)
 
,t as
(
select tt.[Code],tt.[Z_Name],tt.[B_Code],tt.[B_Name],
       cast(1 as varchar(100)) level ,
       CAST(rownum as varchar(100)) sort
from tt 
where not exists(select 1 from tt a where tt.code = a.b_code)

union all

select tt.[Code],tt.[Z_Name],tt.[B_Code],tt.[B_Name],
       cast(t.level+'-'+cast(tt.rownum as varchar(100)) as varchar(100)),
       cast(t.sort+'-'+cast(tt.rownum as varchar(100)) as varchar(100))
from t
inner join tt
        on tt.Code = t.B_Code
)


select [Code],[Z_Name],[B_Code],[B_Name],
       level as 节点属性
from t 
order by sort
/*
Code	Z_Name	B_Code	B_Name	节点属性
1001	水龙头	10089	螺丝	1
1001	水龙头	10063	水管	1
10063	水管	102331	塑料	1-1
10063	水管	102303	胶皮	1-2
102303	胶皮	203301	胶水	1-2-1
102303	胶皮	203302	布料	1-2-2
1001	水龙头	10082	扳手	1
10082	扳手	205410	铁柄	1-1
10082	扳手	205418	铁头	1-2
1001	水龙头	10081	胶带	1
*/


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值