27,579
社区成员
发帖
与我相关
我的任务
分享
ALTER FUNCTION fn_GetFullNode(@node nvarchar(100),@levelid varchar(100))
RETURNS @tbnodes TABLE(ID int IDENTITY(1,1), [父类] nvarchar(24),[子类] nvarchar(24),[父类标识] int,nodeid varchar(100))
AS
BEGIN
;WITH nodes AS (
SELECT 父类,子类,父类标识,CONVERT(VARCHAR(100),@levelid+LTRIM(ROW_NUMBER()OVER(ORDER BY 子类))) AS nodeid
FROM dbo.Tree
WHERE 父类=@node
)
INSERT INTO @tbnodes(父类,子类,父类标识,nodeid)
SELECT * FROM nodes
UNION
SELECT c.父类,c.子类,c.父类标识,c.nodeid FROM nodes AS n CROSS APPLY fn_GetFullNode(n.子类,n.nodeid) AS c
RETURN
END
SELECT * FROM fn_GetFullNode(N'汽车',100) ORDER BY nodeid
if not object_id(N'Tempdb..#T') is null drop table #T
Create table #T([父类] nvarchar(24),[子类] nvarchar(24),[父类标识] int)
Insert #T
select N'汽车',N'车壳',0 union all
select N'汽车',N'车轮',1 union all
select N'汽车',N'发动机',1 union all
select N'汽车',N'车载系统',1 union all
select N'车轮',N'轮毂',0 union all
select N'车轮',N'轮胎',0 union all
select N'发动机',N'活塞',0 union all
select N'发动机',N'缸体',0 union all
select N'车载系统',N'传感器',0 union all
select N'车载系统',N'电子设备',1 union ALL
select N'电子设备',N'电子设备1',0 union ALL
select N'电子设备',N'电子设备2',0
;WITH cte AS
(
SELECT CONVERT(NVARCHAR(24), N'汽车') AS 父类 ,CONVERT(NVARCHAR(24),N'汽车') AS 子类,CONVERT(VARCHAR(10),'0') AS ID
UNION ALL
SELECT t.父类,t.子类,CONVERT(VARCHAR(10),cte.ID+LTRIM(ROW_NUMBER()OVER(ORDER BY t.子类))) AS ID FROM #T AS t JOIN cte ON t.父类=cte.子类
)
SELECT * FROM cte ORDER BY ID
+------+-------+------+
| 父类 | 子类 | ID |
+------+-------+------+
| 汽车 | 汽车 | 0 |
| 汽车 | 发动机 | 01 |
| 发动机 | 活塞 | 011 |
| 发动机 | 缸体 | 012 |
| 汽车 | 车壳 | 02 |
| 汽车 | 车轮 | 03 |
| 车轮 | 轮毂 | 031 |
| 车轮 | 轮胎 | 032 |
| 汽车 | 车载系统 | 04 |
| 车载系统 | 传感器 | 041 |
| 车载系统 | 电子设备 | 042 |
| 电子设备 | 电子设备1 | 0421 |
| 电子设备 | 电子设备2 | 0422 |
+------+-------+------+
WITH CTE_1
AS
(select *,ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS seq_1 from #T),
CTE_2
AS
(select *,seq_1 as par_seq,1 as level
from CTE_1 where 父类='汽车'
union all
select A.*,par_seq,level+1
from CTE_1 A
join CTE_2 B ON A.父类=B.子类)
select * from
(select 子类,par_seq,level,ROW_NUMBER() over (partition by par_seq order by (select 1)) as seq_2 from CTE_2
union all
select '汽车' ,0,0,0) as A
order by par_seq,level,seq_2
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([父类] nvarchar(24),[子类] nvarchar(24),[父类标识] int)
Insert #T
select N'汽车',N'车壳',0 union all
select N'汽车',N'车轮',1 union all
select N'汽车',N'发动机',1 union all
select N'汽车',N'车载系统',1 union all
select N'车轮',N'轮毂',0 union all
select N'车轮',N'轮胎',0 union all
select N'发动机',N'活塞',0 union all
select N'发动机',N'缸体',0 union all
select N'车载系统',N'传感器',0 union all
select N'车载系统',N'电子设备',0
Go
--测试数据结束
;WITH cte AS (
SELECT *,1 AS rn FROM #T WHERE 父类='汽车'
UNION ALL
SELECT #T.*,rn+1 FROM #T JOIN cte ON #T.父类=cte.子类
),cteb AS (
SELECT '汽车' AS 子类,0 AS rn
UNION
SELECT 子类,rn FROM cte
)
SELECT 子类 FROM cteb ORDER BY rn