首页  /  留言  /  音乐  /  管理

树形结构的操作

 最近一直被树形结构整的很头大,又是递归,又是循环,但是,好在我们在经历了千辛万苦后,终于弄出来了,其实就是组织机构的常规操作,有些是我们过度设计,有些是我们想错了,而对数的逻辑读取,我们就属于想错了的类型,今天拿出来和大家分享,主要是树形结构在数据库的读取问题!

原始:

在最开始,我们对树的查询,肯定是从最简单的select开始,我们现在回顾一下:

定义:

表名:tb_tree

字段:id(主键),title(标题),parentId(父节点id)

举例:

1、查找树中的所有顶级父节点(辈份最长的人)。 假设这个树是个目录结构,那么第一个操作总是找出所有的顶级节点,再根据该节点找到其下属节点。

select * from tb_tree m where m.parent is null;

2、查找一个节点的直属子节点(所有儿子)。 如果查找的是直属子类节点,也是不用用到树型查询的。

select * from tb_tree m where m.parent=1;  

递归:

简介:

        经过一段时间的维护,我们发现,当我们处理的逻辑复杂时,我们和数据库就会与多次交互,而这是不符合网络交互的现状的,我们还是希望,尽量通过一次交互,传递更多的信息,减少对带宽的压力,经过多方讨论,我们发现Oracle其实已经做了这个工作,我们一起来看看:

        我们经过不断的探索,发现oracle树查询的最重要的就是select…start with…connect by…prior语法了。依托于该语法,我们可以将一个表形结构以树的顺序列出来。

1、start with id= 是定义起始节点(种子),可以是id也可以是root_id,定义为root_Id查询该节点下所有的树结构,定义为id(子节点)则查询指定的树

2、connect by prior :prior的含义为先前,前一条记录。prior id=root_id 也就是前一条记录的id等于当前记录的root_id(父id)

举例:
1、查找一个节点的所有直属子节点(所有后代)。
select * from tb_menu m start with m.id=1 connect by m.parent=prior m.id;  
这个查找的是id为1的节点下的所有直属子类节点,包括子辈的和孙子辈的所有直属节点。
 
2、查找一个节点的直属父节点(父亲)。 如果查找的是节点的直属父节点,也是不用用到树型查询的。
select c.id, c.title, p.id parent_id, p.title parent_title  from tb_menu c, tb_menu p  where c.parent=p.id and c.id=6 
 
3、查找一个节点的所有直属父节点(祖宗)。
select * from tb_menu m start with m.id=38 connect by prior m.parent=m.id;  
 
4、level字段为oracle特有的层级字段,可以通过level字段查询指定的层级
select root_id,id,name,level from t2 where level=1  start with root_id = 0   connect by prior id = root_id;  
 
总结:
        通过这几天的观察,我们发现,集体的智慧永远是最强大的,每个人贡献一点点,我们就能将问题的解决方案在设计之初就升级到一个客观的程度,包括这次的树形结构的研究,相信你的队友不论他在你心理到底是什么状态,他既然被招进公司,肯定有他的闪光点打动了人力部门,且还有一句话,高手在民间,这句话,已经多次被验证了!
 
原文:http://blog.csdn.net/xvshu/article/details/42110687 
 
作者:Wilber 类别:编程学习 时间:2014/12/24 23:56:37 评论:0 点击50
标签:  webczw,伟博小城
打印:  打印本页
字体:  
本页地址:  http://www.webczw.com/s/2014122500401241.html
上一篇:白头吟
下一篇:HttpWatch

  评论    
当第一个评论者吧!抢沙发>>
  
昵    称: Wilber
形    象:
内    容:
验证码:   
以上网友发言只代表其个人观点,不代表伟博小城的观点或立场。
  Copyright © 2010 - 2016 WEBCZW.COM, All Rights Reserved
伟博小城  版权所有 网站统计
粤ICP备14091989号