日期:2014-05-17  浏览次数:20621 次

SQL Server 递归找出父/子记录,并实现层级关系码???
CREATE TABLE [Users](
[UserID] [bigint],
[LoginName] [nvarchar](50),
[FatherUserID] [bigint]
)

userid   name   FatherUserID
 1       name1      0
 2       name1     1
 3       name1     1
 4       name1     2
 5       name1     2
 6       name1     4
 7       name1     4
 
根据UserID 递归查询,父级型子级数,并标用户当前所在层级?


-------------------- 递归SQL语句

with temp_users as
(
select UserID,LoginName,FatherUserID from Users where UserID=1
union all
select  A.UserID,A.LoginName,A.FatherUserID from Users A,temp_users B where A.FatherUserID=B.UserID
)
select * from w_users

怎么获取子级用户所在层级,怎么实现。

------解决方案--------------------

;with temp_users as
(
select UserID,LoginName,FatherUserID,1 as levle from #t where UserID=1
union all
select  A.UserID,A.LoginName,A.FatherUserID,B.levle+1 from #t A,temp_users B where A.FatherUserID=B.UserID
)
select * from temp_users

------解决方案--------------------
with temp_users as
(
select UserID,LoginName,FatherUserID,cast(1 as int) as [level] from Users where UserID=1
union all
select  A.UserID,A.LoginName,A.FatherUserID,b.[level]+1 as [level] from Users A,temp_users B where A.FatherUserID=B.UserID
)
select * from w_users

------解决方案--------------------
引用:
szm341
你的这个方法我试过,不行。
使用 UNION、INTERSECT 或 EXCEPT 运算符合并的所有查询必须在其目标列表中有相同数目的表达式


select identity(int,1,1)userid,* into #t from(
select 'name1'LoginName,0 FatherUserID
union all select 'name2',     1
union all select 'name3',     1
union all select 'name4',     2
union all select 'name5',     2
union all select 'name6',     4
union all select 'name7',     4
)a

;with temp_users as
(
select UserID,LoginName,FatherUserID,1 as levle from #t where UserID=1
union all
select  A.UserID,A.LoginName,A.FatherUserID,B.levle+1 from #t A,temp_users B where A.FatherUserID=B.UserID
)
select * from temp_users

/*
UserID LoginName FatherUserID levle
1 name1                0 1
2 name2