日期:2014-05-18  浏览次数:20601 次

求一树型查询!!
AdminPart_Id     AdminPart_Name     AdminPart_UpId

6 分站管理员 11
11 超级管理员 0
12           北京分站管理员                         6
13           上海分站管理员                         6
14           北京新闻频道管理员                 12
15           上海新闻频道管理员                   13

要求实现这样的查询     如果     我输入的是       6  
那么结果为

12           北京分站管理员                         6
13           上海分站管理员                         6
14           北京新闻频道管理员                 12
15           上海新闻频道管理员                   13
如果输入的是     13  
则结果为
15           上海新闻频道管理员                   13
如果输入的是     12  
则结果为  
14           北京新闻频道管理员                 12


------解决方案--------------------
if object_id( 'tbTest ') is not null
drop table tbTest
if object_id( 'fnGetChildren ') is not null
drop function fnGetChildren
GO
create table tbTest(AdminPart_Id int,AdminPart_Name varchar(20),AdminPart_UpId int)
insert tbTest
select 6, '分站管理员 ', 11 union all
select 11, '超级管理员 ', 0 union all
select 12, '北京分站管理员 ', 6 union all
select 13, '上海分站管理员 ', 6 union all
select 14, '北京新闻频道管理员 ', 12 union all
select 15, '上海新闻频道管理员 ', 13
GO
create function fnGetChildren(@id int)
returns @t table(AdminPart_Id int,AdminPart_Name varchar(20),AdminPart_UpId int)
as
begin
insert @t select AdminPart_Id,AdminPart_Name,AdminPart_UpId from tbTest where AdminPart_UpId = @id
while @@rowcount > 0
insert @t select a.AdminPart_Id,a.AdminPart_Name,a.AdminPart_UpId from tbTest as a
inner join @t as b on a.AdminPart_UpId = b.AdminPart_Id
and a.AdminPart_Id not in (select AdminPart_Id from @t)
return
end
GO
----查询
declare @id int
set @id = 6
select * from dbo.fnGetChildren(@id)

----清除测试环境
drop table tbTest
drop function fnGetChildren

/*结果:
AdminPart_Id AdminPart_Name AdminPart_UpId
------------ -------------------- --------------
12 北京分站管理员 6
13 上海分站管理员 6
14 北京新闻频道管理员 12
15 上海新闻频道管理员 13
*/
------解决方案--------------------
create table test(AdminPart_Id int,AdminPart_Name varchar(30),AdminPart_UpId int)
insert test select 6, '分站管理员 ',11
union all select 11, '超级管理员 ',0
union all select 12, '北京分站管理员 ',6
union all select 13, '上海分站管理员 ',6
union all select 14, '北京新闻频道管理员 ',12
union all select 15, '上海新闻频道管理员 ',13
go