如何在数据表中实现这样的关系(树形)?SQL SERVER7(200分)

  • 主题发起人 主题发起人 sportsman
  • 开始时间 开始时间
S

sportsman

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在数据表中实现这样的关系(树形)
0
1 2
3 4 5 6
7 8
9 10 ......
这里有一种很不利于查询的建表方法。
方法1:
code father_code
1 0
2 0
3 1
4 1
.......
9 7
10 7
......
如果查询的深度过大,需要相应深度的select嵌套,很麻烦。
方法2:
code father_code grandpa_code root_code
7 3 1 0
8 4 1 0
5 2 2 0
......
有很大的冗余,并且伸缩性不大。五层关系就容不下。

请各位高手指点。
 
看不懂,什么意思?那些数字是什么?
字段的值还是字段长度?
 
你建5个表不行吗?
表1 root_code
表2 sub1_code ,root_code
表3 sub2_code ,sub1_code
表4 sub3_code ,sub2_code
表5 sub4_code ,sub3_code
 
to all:
sorry,我没有解释清楚。

to tanglu:
数字代表特殊的纪录,相互间有层次关系。

to netwind:
不行。因为我要选中所有的分支。
example:选中了7就要把9,10也选出来。
 
用方法一,查询的时候只查出根结点,需要的时候再查询下面的子结点
 
有什么不行呢?
如果选7的话
select sub4_code ,sub3_code from 表5 where sub3_code ='7'
如果选3的话
select 表5.sub4_code ,表5.sub3_code ,表4.sub2_code from 表5,表4
where 表5.sub3_code = 表4.sub3_code and 表4.sub2_code ='3'
不知道我理解得对不对
 
可不可以通过一个代码来区分层次。
例如在财务中:102表示银行科目,10101就可能是更明晰的例如招商银行。
这样通过分析固定长度的层次代码,就可以确定树状结构。
 
你的问题和ERP软件里的BOM问题基本一样,树的层数不定,每层的节点数也不定(非二叉
树),我看过很多ERP软件的解决方法,都是使用CODE-FATHERCODE模式,在查询时只查出本层
和下层,如果做完全遍历,则使用递归调用,就是创建一个函数自己调用自己
function QueryBOM(ID:string):string;
var
AID:string;
begin
{exec some query or sth else to get AID ,and use it as param to recall self agin}
{AID:=Query1.ParamsByName('Code').AsString; like that}
if AID<>'' then QueryBOM(AID) //递归调用的出口,否则就是死循环了,出口条件有很多种
end
另外还有一个字段 就是低层码,lowlevelcode,用于表示在BOM中的每种项目最深的层数,
在对BOM进行不完整和约束性处理计算的时候比较有用。
 
Code ParentCode
0 null
1 0
2 0
3 1;0
4 1;0
5 2;0
6 2;0
7 3;1;0
8 3;1;0
9 7;3;1;0
10 7;3;1;0
,,,,

关键, ParentCode中保存所有直接与间接父节点, 当然顺序也可以是直接父在前或者
根据树结构从根往下排.
优点:
从任何一个节点都可以很方便建立本枝的树结构(如果愿意, 建立整个树都没问题, 而
且比只有一级父节点简单). 最大好处是可以直接查询一个节点是否属于另一个节点
(用SQL的Like就可以了, 只要定义好ParentCode中的分隔符, 查询时将分隔符作为
查询条件一起进入SQL中).

建立新节点也很容易, 只要将父节点的ParentCode复制过来并加上直接父节点即可.

删除也容易, 可以很容易将某个节点连带的所有子节点一起删除而不必用循环或者递归

缺点: 将Integer变量转成了字符串对效率有细微的影响, 毕竟查询Integer是最快的.
不过这种牺牲相对程序的简洁和执行效率来说还是非常值得的, 对SQL Server这类不
支持PID形式的数据库来说是最佳解决方法(oracle好象直接就支持PID这种方式, 可以
用一句SQL将其展开, 不过我不熟悉).
 
to all:
我需要消化一下。。。。。。
 
to Another_eYes:我也想过,可是实现起来似乎有点问题
to zhuhuan:谢谢你的答案,可我想在如何安排表结构上下功夫,最便于查询。
to netwind:如果我有100层呢?似乎不能用建表来解决吧?
to delphiwolf:我就是想解决方法一的不便。
 
工作原因,暂别大富翁,做个了结,后会有期。
 
多人接受答案了。
 
后退
顶部