Sqlserver递归查询所有上级或所有下级成员

创建表

CREATE TABLE [dbo].[test_user](
	[UserId] [int] NOT NULL,
	[ParentUserId] [int] NULL,
	[UserName] [nvarchar](50) NULL,
 CONSTRAINT [PK_test_user] PRIMARY KEY CLUSTERED 
(
	[UserId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]


插入测试数据

INSERT INTO [test_user] VALUES (1, 0, '顶级人员');
GO
INSERT INTO [test_user] VALUES (2, 1, '二级人员');
GO
INSERT INTO [test_user] VALUES (3, 1, '二级人员2');
GO
INSERT INTO [test_user] VALUES (4, 2, '二级人员_三级人员');
GO
INSERT INTO [test_user] VALUES (5, 4, '二级人员_三级人员_四级');
GO
INSERT INTO [test_user] VALUES (6, 5, '二级人员_三级人员_四级_五级');
GO



查询语句

--所有下级
with foruserchild(UserId,ParentUserId,UserName,level)
as (
	select test_user.*,0 as [level] from test_user where userid = 2
	union all
	select test_user.*,level+1 as [level] from test_user
	inner join foruserchild on (test_user.ParentUserId = foruserchild.UserId)
)

select * from foruserchild;

--所有父级
with foruserparent(UserId,ParentUserId,UserName,level)
as (
	select test_user.*,0 as [level] from test_user where userid = 2
	union all
	select test_user.*,level+1 as [level] from test_user
	inner join foruserparent on (test_user.UserId = foruserparent.ParentUserId)
)
select * from foruserparent;

--所有数据
select * from test_user;



结果

image.png



转载请说明出处:原文链接 http://www.nbsite.cn/database/235

相关阅读:

sqlserver数据库没有日志文件ldf只有数据mdf,如何附加

SQL Server CPU时间和占用时间及优化

该帐户当前被锁定,所以用户 'sa' 登录失败。系统管理员无法将该帐户解锁。(Microsoft SQL Server,错误: 18486)

如何查看SQL Server的索引碎片情况