树型表结构的处理

时间:2022-05-18 13:46:44
本人在开发软件的过程中,总是遇到机构组织表的定义问题,过去总是定义为固定的层次,但是这次由于机构组织在运行过程中,随时要变动:合并部门,拆分部门,人员调动等等问题,所以本人打算采用“树型”设计。

总部--                |----北京分公司
     |——事业一部——|
     |                |——西安分公司
     |
     |----事业二部

表名:PartInfo

PartID(int )--部门ID
ParentID(int)--父ID
PartName(varchar) 部门名称
。。。

请问:这样的数据机构在我们写SQL关联其他表的数据进行查询时怎么解决?
是否要用到递归SQL,请详解。

6 个解决方案

#1


部门ID是唯一标示,用它来关联其他表就可以了;我觉得不用用到递归,你每次点击一个部门时,只查找它的下面两级子节点就可以了,不必找出全部的,只找你点击的那个节点的下两级。

#2


其实有很多方法可以找了其所有下级,也不一定要使用递归,当然递归也是一种很好的办法。

下面的方法就可以把你上述的结构转换成0000100001这各树型结构,这两种结构各有优缺点,这种树的最大好处就是查子类特别方便,但是维护复杂一些,不过你现在只要维护你现在的结构,就能在两种方式上选择方便的方法来实现你的需求,


drop table #temp
select id,fatherid,name,cast('' as varchar(8000)) as OrderCol into #temp from temp$

declare @I int,@J int
select @I=1
select @j=(select max(id) from #temp)
while @I<=@j
begin
update  #temp 
set OrderCol=
isnull((select OrderCol from #temp as cc where id=#temp.FatherId),'')+
right('0000'+cast(#temp.fatherid as varchar),4)
+right('0000'+cast(#temp.id as varchar),4)
where #temp.id=@I
select @i=@I+1
end


select * from #temp order by OrderCol

#3


我的问题关键在于,如果某一个单据发生时候记的是 某一个部门下的某一个员工的ID,但是当该员工调离本部门以后,如果查询这个单据,肯定就把这个单据的发生者纪录成了现在新部门的员工,而形成的数据不真实情况。

#4


http://expert.csdn.net/Expert/topic/1343/1343007.xml?temp=.4894373

#5


感谢老范给大家提供了了树形结构的存取问题,但是层次型树型结构的数据库结构给我们带来的最大的问题并不是存取的问题,更重要的是:

单据中怎样记录树型结构的ID问题:
比如我们实际情况中常用树形结构来存储层次型部门结构
员工一般挂在某个部门上,单据中记录着发生此业务的员工,这时当员工的调动、部门的拆分、合并、撤销、省级、降级等等情况,就给查询历史单据带来了很多不真实的情况。我们追求的应该是计算机真实记录着当时单据发生的人、部门,而不是改变后的人或部门。

请资深的系统分析员、程序员、爱好者来一起探讨这类问题

#6


那只要在你的表进行修改或删除时,只做删除标记,对于修改则以修改后的数据插入到表,使其拥有新的ID。

而在你保存数据时只管保存当时的ID,以后需要查询是就不会有问题。

#1


部门ID是唯一标示,用它来关联其他表就可以了;我觉得不用用到递归,你每次点击一个部门时,只查找它的下面两级子节点就可以了,不必找出全部的,只找你点击的那个节点的下两级。

#2


其实有很多方法可以找了其所有下级,也不一定要使用递归,当然递归也是一种很好的办法。

下面的方法就可以把你上述的结构转换成0000100001这各树型结构,这两种结构各有优缺点,这种树的最大好处就是查子类特别方便,但是维护复杂一些,不过你现在只要维护你现在的结构,就能在两种方式上选择方便的方法来实现你的需求,


drop table #temp
select id,fatherid,name,cast('' as varchar(8000)) as OrderCol into #temp from temp$

declare @I int,@J int
select @I=1
select @j=(select max(id) from #temp)
while @I<=@j
begin
update  #temp 
set OrderCol=
isnull((select OrderCol from #temp as cc where id=#temp.FatherId),'')+
right('0000'+cast(#temp.fatherid as varchar),4)
+right('0000'+cast(#temp.id as varchar),4)
where #temp.id=@I
select @i=@I+1
end


select * from #temp order by OrderCol

#3


我的问题关键在于,如果某一个单据发生时候记的是 某一个部门下的某一个员工的ID,但是当该员工调离本部门以后,如果查询这个单据,肯定就把这个单据的发生者纪录成了现在新部门的员工,而形成的数据不真实情况。

#4


http://expert.csdn.net/Expert/topic/1343/1343007.xml?temp=.4894373

#5


感谢老范给大家提供了了树形结构的存取问题,但是层次型树型结构的数据库结构给我们带来的最大的问题并不是存取的问题,更重要的是:

单据中怎样记录树型结构的ID问题:
比如我们实际情况中常用树形结构来存储层次型部门结构
员工一般挂在某个部门上,单据中记录着发生此业务的员工,这时当员工的调动、部门的拆分、合并、撤销、省级、降级等等情况,就给查询历史单据带来了很多不真实的情况。我们追求的应该是计算机真实记录着当时单据发生的人、部门,而不是改变后的人或部门。

请资深的系统分析员、程序员、爱好者来一起探讨这类问题

#6


那只要在你的表进行修改或删除时,只做删除标记,对于修改则以修改后的数据插入到表,使其拥有新的ID。

而在你保存数据时只管保存当时的ID,以后需要查询是就不会有问题。