1.建表脚本
CREATE TABLE [dbo].[tb_tree](
[Id] [int] IDENTITY(1,1) NOT NULL,
[ParentId] [int] NULL,
[NodeName] [nvarchar](50) NULL,
CONSTRAINT [PK_tb_tree] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
[Id]--主键自增
[ParentId]--树形结构中表示从属的父节点
[NodeName] --节点名称
2.插入测试数据
SET IDENTITY_INSERT [dbo].[tb_tree] ON
INSERT [dbo].[tb_tree] ([Id], [ParentId], [NodeName]) VALUES (1, 0, N'Root1')
INSERT [dbo].[tb_tree] ([Id], [ParentId], [NodeName]) VALUES (2, 1, N'Level1-1')
INSERT [dbo].[tb_tree] ([Id], [ParentId], [NodeName]) VALUES (3, 1, N'Level1-2')
INSERT [dbo].[tb_tree] ([Id], [ParentId], [NodeName]) VALUES (4, 2, N'Level1-1-1')
INSERT [dbo].[tb_tree] ([Id], [ParentId], [NodeName]) VALUES (5, 2, N'Level1-1-2')
INSERT [dbo].[tb_tree] ([Id], [ParentId], [NodeName]) VALUES (6, 2, N'Level1-1-3')
INSERT [dbo].[tb_tree] ([Id], [ParentId], [NodeName]) VALUES (7, 2, N'Level1-1-4')
INSERT [dbo].[tb_tree] ([Id], [ParentId], [NodeName]) VALUES (8, 3, N'Level1-2-1')
INSERT [dbo].[tb_tree] ([Id], [ParentId], [NodeName]) VALUES (9, 4, N'Level1-1-1-1')
INSERT [dbo].[tb_tree] ([Id], [ParentId], [NodeName]) VALUES (10, 4, N'Level1-1-1-2')
INSERT [dbo].[tb_tree] ([Id], [ParentId], [NodeName]) VALUES (11, 5, N'Level1-1-2-1')
SET IDENTITY_INSERT [dbo].[tb_tree] OFF
插入结构表示树形结构为:
Root1
┗---Level1-1
┗---Level1-1-1
┗---Level1-1-1-1
┗---Level1-1-1-2
┗---Level1-1-2
┗---Level1-1-2-1
┗---Level1-1-3
┗---Level1-2
┗---Level1-2-1
┗---Level1-3
3.需求1:当需要从任意节点获取所有的子节点父节点列表时,如从Level1-2-1节点需要获取所有的父节点(Level1-2,Root1)
with treeinfo as
(
select Id,ParentId,NodeName from tb_tree where id = 8
union all
select t.Id,t.parentId,t.NodeName from treeinfo ti
inner join tb_tree t on ti.ParentId = t.ID
) select * from treeinfo
查询结果如下:
Id ParentId NodeName
----------- ----------- --------------------------------------------------
10 4 Level1-1-1-2
4 2 Level1-1-1
2 1 Level1-1
1 0 Root1
需求2:从父节点获取所有层级的子节点,如从节点Level1-1查找所有字节点
with treeinfo as(
select Id,ParentId,NodeName from tb_tree where id=2
union all
select t.Id,t.ParentId,t.NodeName from treeinfo ti
inner join tb_tree t on ti.id = t.Parentid
) select * from treeinfo
基本同需求1写法差不多,查询结果如下:
Id ParentId NodeName
----------- ----------- --------------------------------------------------
2 1 Level1-1
4 2 Level1-1-1
5 2 Level1-1-2
6 2 Level1-1-3
7 2 Level1-1-4
11 5 Level1-1-2-1
9 4 Level1-1-1-1
10 4 Level1-1-1-2