层次型表结构的查询-怎么写SQL语句。

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

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

表名:PartInfo

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

请问:这样的数据机构在我们写SQL关联其他表的数据进行查询时怎么解决?
是否要用到递归SQL,请详解。
...全文
750 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
cmsoft 2003-01-10
  • 打赏
  • 举报
回复
增加字段,所在company_now,company_old,area_now,area_old
不过合并区的情况着实少见:),
比如把南京合并成一家公司的话,那么原来的公司不能树型中出现,只能出现一个南京公司,那么你查询时怎么知道有原来的一公司和二公司?
还有拆分公司时也会出现这种情况,就是原来的公司不知道在哪了,数据库中可以保留原公司信息,但新的树型不可能出现合并前的公司了吧。所以查询时出现旧公司时是不是与你树型比较看上去怪怪的吧。当然你也可以把原来的公司列在树型中表明旧字(南京分公司2(旧))不过也怪怪的啊,如此之外其实实现原理跟部门人员调动一个道理啊
cmsoft 2003-01-10
  • 打赏
  • 举报
回复
----华东区
| |----上海市
| | |---上海分公司1
| | | |---部门1
| | | |---部门2
| | | |---……
| | |---上海分公司2
| | | |---部门1
| | | |---部门2
| | | |---……
| | |……
| |----南京市
| | |---南京分公司1
| | | |---部门1
| | | |---部门2
| | | |---……
| | |---南京分公司2
| | | |---部门1
| | | |---部门2
| | | |---……
| | |……
|---华南区
……
cmsoft 2003-01-10
  • 打赏
  • 举报
回复
----华东区
| |----上海市
| | |---上海分公司1
| | | |---部门1
| | | |---部门2
| | | |---……
| | |---上海分公司2
| | | |---部门1
| | | |---部门2
| | | |---……
| | |……
| |-南京市
| | |---南京分公司1
| | | |---部门1
| | | |---部门2
| | | |---……
| | |---南京分公司2
| | | |---部门1
| | | |---部门2
| | | |---……
| | |……
|---华南区
……
这个结构合你的要求吗?不合理的话,你自己画出清楚一点
LIUTAO2002 2003-01-10
  • 打赏
  • 举报
回复
你把我的关键性问题没有搞清,我指的是一个层次型树结构的变动

好,我暂且算你能解决员工的变动,那部门的变动呢?因为部门结构是一个层次型树结构,一个部门的变动会影响整个树的变动,那么通过这种方式只能把树回复到某一个时间点的状态。对于时间段中变动多次的状态无法表示。

我的客户是一个全国有1000多个办事处,分5个大区,每个大区再分成省区
由于是销售型企业所以这种划分经常会改变
cmsoft 2003-01-10
  • 打赏
  • 举报
回复
首先声明我不是能干的高手

1.部门间的经常性的改动不符合常规
2.我举个例字

emp_no emp_name emp_dep_no_now emp_dep_no_old emp_add_time
E0001 张三 3 1,2 2002-01-01,2002-06-01,2002-10-07

这条记录说明张三现在部门号是3,加入时间是2002-10-07,以前曾经呆的部门分别有1和2(加入时间分别是2002-01-01,2002-06-01)
如果现在张三到4这个部门
那记录为
E0001 张三 4 1,2,3 2002-01-01,2002-06-01,2002-10-07,2003-01-10

具体怎么实现,你应该会update这个记录吧
下面是一个单据表

dj_no dj_emp_no dj_time
d_0001 E00001 2002-09-01
这时你应该能确认这个单据是这个员工在哪个部门时留下的吧,按时间段查询也不应该有什么问题了吧
具体的需求我不知道你,只是我的愚见
LIUTAO2002 2003-01-10
  • 打赏
  • 举报
回复
up cmsoft
如果你能给出比较合理的方案,我佩服你是个能干的高手.
LIUTAO2002 2003-01-10
  • 打赏
  • 举报
回复
up cmsoft 我们已经论证了很多方案
两个dep_now/dep_old字段来记录树的修改过程我们论证过了,当你要查询每一条记录的时候都要去结构变动表中去回朔所有历史过程,而当用户指定一个时间段查询的时候,而正好这个时间段中树型表被修改多次,你的单据怎么表现?而且这种方式非常笨拙,不适合大型数据库的查询。
cmsoft 2003-01-10
  • 打赏
  • 举报
回复
用TRIGGER肯定是可以实现的,你自己已经考虑到这个问题,你可以不用UPDATE,你也可以insert到新的部门下啊,这样原先的部门就会保留的,这样一来你又要说这样会产生冗余记录,这我又要问你了,按你的需求你的表怎么设计的呢?如果你的表设计得好的话,则不必要insert一条记录,还是用update,比如我现在有两个dep_now/dep_old字段
dep_now代表这个人所在的最新部门,dep_old代表以前所在部门,查询时就可以实现了,不用我多说了吧,自己动动脑子,不要一下就否定别人的想法
LIUTAO2002 2003-01-10
  • 打赏
  • 举报
回复
请高手来探讨这个问题?
LIUTAO2002 2003-01-10
  • 打赏
  • 举报
回复
up cmsoft 你的这种解决办法比较幼稚,而且根本不能解决。

我试问你,如果按照你的做法作了,如果从原来的部门为条件查找单据,肯定有无法找到这个单据了,因为已经被你改成了新部门下的单据了。

语气少重,请见谅!
cmsoft 2003-01-10
  • 打赏
  • 举报
回复
如果一个员工离开本部门的时候(UPDATE)他相关的记录也要作变动,这时要在员工表里建一个UPDATE的触发器来实现之,有关触发器建议你查询这方面的资料先
LIUTAO2002 2003-01-10
  • 打赏
  • 举报
回复
我的问题关键在于,如果某一个单据发生时候记的是 某一个部门下的某一个员工的ID,但是当该员工调离本部门以后,如果查询这个单据,肯定就把这个单据的发生者纪录成了现在新部门的员工,而形成的数据不真实情况。

希望有经验的同仁们来一起探讨这类问题,我看了金碟、用友等软件的数据结构,这方面解决都很欠缺
LIUTAO2002 2003-01-10
  • 打赏
  • 举报
回复
up
如果数据库是sql server 2000
可以考虑用自定义函数来实现递归?
实现过程?
昵称被占用了 2003-01-06
  • 打赏
  • 举报
回复
看你的数据库是什么,一般可以用存储过程来解决。
如果数据库是sql server 2000可以考虑用自定义函数来实现递归。
如果数据库不支持存储过程,那只能在客户端用多个查询解决了。

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧