列名 依赖列 A B A M那么B和M相对于A是平等的。 为什么你的输出一个在a上一个在a下。 命题有问题。
如果是单一父子关系,则可以使用递归方法找出来,不过需要的是数据多加一标识字段,临时的也无所谓.列名 依赖列 标识种子 ------------------------------ a b 0 b c 0 c d 0 d e 0 e n/a(null) 0 首先查询底阶得e,将e取出并设置[标识种子]为1 递归调用返回一阶到d取出并置1,依此类推.当然在这种情况下如果只有一依赖链,那么就不需要标识,只有多个的时候需要标识.procedure FindDependent(Node:TNode,Table:TTable); begin Table.Seek(Node,[列名]); if Table.[依赖列] is null then begin print(Table.[列名]); Exit; end; FindDependent(Table.[依赖列],Table); print(Table.[列名]); end
To unsigned : 如果非单一依赖关系呢,比如a以来b,a又依赖于c To netfly: 这个办法我也想过,不过对于非单一依赖关系,就不好判断了
应该没有关系的了,这样的找法,每次去掉的都是当前最顶层的了,去掉最顶层后 用 select 依赖列 from #tmp where 依赖列 not in (select 列名 from #tmp) 这样得到的一定是新的顶层。如果有数据,用上面的选不出来,说明定义有循环了,应该是定义错了
To Netfly: 这个问题固然能解决,但是不同层次之间的依赖关系如何处理呢? 难道没有人会依赖算法吗?
说穿了是一个很老套的问题吧 Table1: Parent Child null A A B A D B C ... 要弄个树出来吧。 记得有这样的控件叫DBTreeview。 如果是Oracle的话,还可以SQL语句直接整理出来 select Parent, Child, LEVEL from Table1 CONNECT BY PRIOR Child= Parent
A B A M那么B和M相对于A是平等的。
为什么你的输出一个在a上一个在a下。
命题有问题。
------------------------------
a b 0
b c 0
c d 0
d e 0
e n/a(null) 0
首先查询底阶得e,将e取出并设置[标识种子]为1
递归调用返回一阶到d取出并置1,依此类推.当然在这种情况下如果只有一依赖链,那么就不需要标识,只有多个的时候需要标识.procedure FindDependent(Node:TNode,Table:TTable);
begin
Table.Seek(Node,[列名]);
if Table.[依赖列] is null then
begin
print(Table.[列名]);
Exit;
end;
FindDependent(Table.[依赖列],Table);
print(Table.[列名]);
end
在TMP表删除依赖列为刚才的不依靠的列, 继续循环,得到二楼,三楼,N搂数据
呵呵
如果非单一依赖关系呢,比如a以来b,a又依赖于c
To netfly:
这个办法我也想过,不过对于非单一依赖关系,就不好判断了
用 select 依赖列 from #tmp where 依赖列 not in (select 列名 from #tmp)
这样得到的一定是新的顶层。如果有数据,用上面的选不出来,说明定义有循环了,应该是定义错了
这个问题固然能解决,但是不同层次之间的依赖关系如何处理呢?
难道没有人会依赖算法吗?
Table1:
Parent Child
null A
A B
A D
B C
...
要弄个树出来吧。
记得有这样的控件叫DBTreeview。
如果是Oracle的话,还可以SQL语句直接整理出来
select Parent, Child, LEVEL from Table1 CONNECT BY PRIOR Child= Parent