现在有两张表,
create table Depart(id int , DepartName varchar(10)) 
insert into Depart values(1 ,'技术部') 
insert into Depart values(2 ,'网络部') 
insert into Depart values(3 ,'营销部') 
insert into Depart values(4 ,'市场部')
create table User(id int , Name varchar(10),DepartID int,Permission varchar(20)) 
insert into User values(1,'一号',1,'1/2/3') 
insert into User values(2,'二号',2,'-1') 
insert into User values(3,'三号',3,'3/4') 
insert into User values(4,'四号',4,'-1')
第一张表是部门,第二张是用户,用户表的DepartID字段和Permission字段对应部门表的ID,Permission字段为-1代表无权限,而'1/2/3'代表管理id为1 2 3的三个部门。现在我想得到这样一个效果,查询一个部门ID,列举出这个部门的管理者所有管理的部门ID。假如查询ID为1的部门,枚举出用户中DepartID为1的有权限用户,再根据这些有权限用户的权限枚举出这些用户管理的部门,再根据那些部门中的有权限用户继续枚举,直到枚举到的所有用户权限为-1为止。例如查询Depart表ID是1时,先得到用户ID=1,Permission='1/2/3' 根据1/2/3得到Depart表中ID=1 2 3的部门, 1部门只有一个有权限用户已经枚举过,所以去掉,2号部门用户只有一个权限-1的 到这里停止,3号部门有一个用户权限为'3/4' 3号部门的一个有权限用户也已经枚举过,去掉,4号部门用户权限-1,结束。最后得到1 2 3 4。也许表述的不是很清楚,但是大致意思就是这样,请问如何写语句啊?还有,一个部门里不一定只有一个人,但是保证一个部门只有一名管理者。

解决方案 »

  1.   


    if object_id('tempdb..#User') is not null
    drop table #User;
    create table #User(id int , Name Nvarchar(10),DepartID int,Permission varchar(20)) 
     insert into #User values(1,N'一号',1,'1/2/3') 
     insert into #User values(2,N'二号',2,'-1') 
     insert into #User values(3,N'三号',3,'3/4') 
     insert into #User values(4,N'四号',4,'-1') ;with t as
     (
     select id,Name,DepartID,
     substring(Permission+'/',1,charindex('/',Permission+'/')-1) as Permission
     ,substring(Permission+'/',charindex('/',Permission+'/')+1,len(Permission+'/')) as PermissionSplit
     from #User
     union all
     select id,Name,DepartID
     ,substring(PermissionSplit,1,charindex('/',PermissionSplit)-1) as Permission
     ,substring(PermissionSplit,charindex('/',PermissionSplit)+1,len(PermissionSplit)) as PermissionSplit
     from t
     where charindex('/',PermissionSplit)>0
     )
     select id,Name,DepartID,Permission
     into #tbUser
     from t
     order by id ;with t as
     (
     select id,name,DepartId,Permission
     from #tbUser
     union all
     select a.id,a.name,a.DepartId,b.Permission as Permission
     from t a join #tbUser b
     on a.Permission=b.departId and a.Permission<>-1
     and a.departid<>b.departid and b.DepartId<>b.Permission
     )
     select distinct Permission
     from t
     where Permission<>-1
     and departid=1
    这种表结构设计不满足第一范式
      

  2.   

    sql server2000报错,然后能不能自定义一个函数完成这个任务?
      

  3.   

    2000的话,用while循环吧我用while循环和游标,可是写到一半不知道怎么写了,跪求点思路啊