就一个表就好。 比如这样 orgid int superid int orgname varchar(64) ...等等其它字段其中orgid,部门id,主键 superid,指向它的上级部门的orgid,如果这个部门没有上级部门(即是说是第一层)可以设为0------- 以后你可能想得到某一个部门下的第一层部门,可以通过 select * from org where superid=xxx来得到。 然后写个递归调用的自定义函数,这样用select orgid from GetAllSubOrg(xxx) 就能得到xxx部门下的所有子部门。
CREATE FUNCTION [dbo].GetAllSubOrg (@orgId int) RETURNS @orglist TABLE (orgid int) AS BEGIN DECLARE @subOrgId int insert into @orglist select orgid from org where superid=@orgId --查询子机构的用户 DECLARE orgs CURSOR LOCAL FOR select orgid from org where superid=@orgId /* 打开游标 */ OPEN orgs WHILE @@ERROR=0 BEGIN FETCH NEXT FROM orgs INTO @subOrgId; if @@FETCH_STATUS <> 0 break; insert into @orglist select orgid from GetAllSubOrg(@subOrgId) end --关闭、释放游标 CLOSE orgs DEALLOCATE orgs return END
比如这样
orgid int
superid int
orgname varchar(64)
...等等其它字段其中orgid,部门id,主键
superid,指向它的上级部门的orgid,如果这个部门没有上级部门(即是说是第一层)可以设为0-------
以后你可能想得到某一个部门下的第一层部门,可以通过
select * from org where superid=xxx来得到。
然后写个递归调用的自定义函数,这样用select orgid from GetAllSubOrg(xxx) 就能得到xxx部门下的所有子部门。
CREATE FUNCTION [dbo].GetAllSubOrg (@orgId int)
RETURNS @orglist TABLE (orgid int)
AS
BEGIN
DECLARE @subOrgId int
insert into @orglist select orgid from org where superid=@orgId --查询子机构的用户
DECLARE orgs CURSOR LOCAL FOR
select orgid from org where superid=@orgId
/* 打开游标 */
OPEN orgs
WHILE @@ERROR=0 BEGIN
FETCH NEXT FROM orgs INTO @subOrgId;
if @@FETCH_STATUS <> 0
break;
insert into @orglist select orgid from GetAllSubOrg(@subOrgId)
end
--关闭、释放游标
CLOSE orgs
DEALLOCATE orgs
return
END
一个存放关系的,比如父id和子id
比如表内容为:
0 1
0 2
1 3
1 4
....另一个表存放信息的,如id、.......(通过id关联)
table department{
id,
parentid,
...
department information
...
}
但是查询起来不方便