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

sql server 2000 查询语句问题
现在有两张表,
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。也许表述的不是很清楚,但是大致意思就是这样,请问如何写语句啊?还有,一个部门里不一定只有一个人,但是保证一个部门只有一名管理者。

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

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