问一个数据库查询中显示树型结构的问题!有点难度!来者有分!

时间:2020-12-06 12:00:50
一个树,下面的子树和节点无限制,
怎么能做个查询,能够获取树中某一个节点其下属于它自己的所有节点的各种信息,而且还要遍历所有节点获取所有节点其下节点的信息,我研究了几天,但是除了递归嵌套,实在想不出什么更好的,速度更快的办法,数据库里有一个ID数据,是表示节点的唯一标志,没有重复,还有一个PID,表示该节点所属的父节点ID,还有一个TLEVEL,表示该节点在树中属于第几层,
我的方法是根据该节点的ID关联PID,先获取它下一层所有节点的信息,然后再根据这层里属于它的所有节点ID获取下下一层的信息,依次类推,但是这样的做法太慢了,尤其是树的层次和节点变多了以后,简直是无法忍受的慢,大家有没有更好的办法呢?也欢迎大家来讨论!来者有分!

24 个解决方案

#1


如果真的是无限的话,也只好递归了。

#2


或者说数据表的结构修改一下,能不能改成有利于快速查询呢?!我目前还仅仅只是想到这个方法,实在是想不出更好的方法了,召唤高手!

#3


分可以再加,我有的是分!

#4


在表中加当前纪录ID的深度。

#5


哦,我没看到有层次的。

那可以先把最深层找出来,然后再循环啊。

#6


http://www.hz0752.com/UploadFile/2005-5/2005524155546821.jpg

是不是想要上图的效果

#7


循环到下面有很多节点根本就不是你的,TLEVEL基本只能用来做做判断而已!

#8


to bbsftp(烨) :不是这样的,是数型的,有很多层次的那种!而且层次不确定,你这个的只有一个层次!

#9


oracle 
start with

#10


递归查询

#11


是不是要这种效果啊
http://www.hz0752.com/UploadFile/2005-5/2005527203753567.jpg

#12


1.加LEVEL
2.首先建立TopItem或者它的直接下级,然后在点树的时候再展开节点信息.

#13


to bbsftp(烨):对,就是这个效果!

#14


to  5207(踏雪):加LEVEL了,但是你说的第二个不是太明白,另外,我是说在数据库里做查询的时候怎么做,在treeview控件里这个好办,毕竟人是活的,电脑是死的!

#15


顶!

#16


如果是 Oracle 数据库,倒是可以用 

select ...from ... start with...connect by prior...这样的语句快速查询。

别的数据库不知道了。



dacong(大聪) 上面也提到了。

#17


这个问题我也碰到过,嵌套到后来简直无法容忍其“慢”,在网上搜个第三方控件DBTREE,带例子,你会发现实现你的目标非常EASY。

#18


哦,ORACLE可以啊,不过我的数据库是SQL SERVER的!DBTREE控件我用不上它,只是要查询而已,但是这个问题我查找了关于DBTREE的算法,基本上没有什么帮助!它只能获取全局树,对于获取子树下的节点信息方面,几乎没有任何帮助!还是只能通过挨个遍历,遍历里面再加嵌套才能实现!真是郁闷!

#19


感觉复杂点的树问题,还是要第归

#20


数据结构上用了个非第归的,我没怎么搞懂,考虑使用堆栈解决

#21


恩,我明天找找算法的书看看!

#22


找到了,不过晕了,算法的书也是那个德行,照样离不开递归!没办法了!只好这样了!

#23


up

#24


shit

#1


如果真的是无限的话,也只好递归了。

#2


或者说数据表的结构修改一下,能不能改成有利于快速查询呢?!我目前还仅仅只是想到这个方法,实在是想不出更好的方法了,召唤高手!

#3


分可以再加,我有的是分!

#4


在表中加当前纪录ID的深度。

#5


哦,我没看到有层次的。

那可以先把最深层找出来,然后再循环啊。

#6


http://www.hz0752.com/UploadFile/2005-5/2005524155546821.jpg

是不是想要上图的效果

#7


循环到下面有很多节点根本就不是你的,TLEVEL基本只能用来做做判断而已!

#8


to bbsftp(烨) :不是这样的,是数型的,有很多层次的那种!而且层次不确定,你这个的只有一个层次!

#9


oracle 
start with

#10


递归查询

#11


是不是要这种效果啊
http://www.hz0752.com/UploadFile/2005-5/2005527203753567.jpg

#12


1.加LEVEL
2.首先建立TopItem或者它的直接下级,然后在点树的时候再展开节点信息.

#13


to bbsftp(烨):对,就是这个效果!

#14


to  5207(踏雪):加LEVEL了,但是你说的第二个不是太明白,另外,我是说在数据库里做查询的时候怎么做,在treeview控件里这个好办,毕竟人是活的,电脑是死的!

#15


顶!

#16


如果是 Oracle 数据库,倒是可以用 

select ...from ... start with...connect by prior...这样的语句快速查询。

别的数据库不知道了。



dacong(大聪) 上面也提到了。

#17


这个问题我也碰到过,嵌套到后来简直无法容忍其“慢”,在网上搜个第三方控件DBTREE,带例子,你会发现实现你的目标非常EASY。

#18


哦,ORACLE可以啊,不过我的数据库是SQL SERVER的!DBTREE控件我用不上它,只是要查询而已,但是这个问题我查找了关于DBTREE的算法,基本上没有什么帮助!它只能获取全局树,对于获取子树下的节点信息方面,几乎没有任何帮助!还是只能通过挨个遍历,遍历里面再加嵌套才能实现!真是郁闷!

#19


感觉复杂点的树问题,还是要第归

#20


数据结构上用了个非第归的,我没怎么搞懂,考虑使用堆栈解决

#21


恩,我明天找找算法的书看看!

#22


找到了,不过晕了,算法的书也是那个德行,照样离不开递归!没办法了!只好这样了!

#23


up

#24


shit