近期一直被树形结构整的很是头大,又是递归。又是循环。但是,好在咱们在经历了千辛万苦后。最终弄出来了。事实上就是组织机构的常规操做,有些是咱们过分设计。有些是咱们想错了。而对数的逻辑读取,咱们就属于想错了的类型。今天拿出来和你们分享。主要是树形结构在数据库的读取问题!sql
在最開始。咱们对树的查询,确定是从最简单的select開始。咱们现在回想一下:数据库
表名:tb_tree网络
字段:id(主键),title(标题),parentId(父节点id)oracle
一、查找树中的所有顶级父节点(辈份最长的人)。 若是这个树是个文件夹结构。那么第一个操做老是找出所有的顶级节点,再依据该节点找到其下属节点。spa
select * from tb_tree m where m.parent is null;
二、查找一个节点的直属子节点(所有儿子)。 假设查找的是直属子类节点。也是不用用到树型查询的。
设计
select * from tb_tree m where m.parent=1;
通过一段时间的维护,咱们发现。当咱们处理的逻辑复杂时,咱们和数据库就会与屡次交互。而这是不符合网络交互的现状的,咱们仍是但愿,尽可能经过一次交互。传递不少其它的信息,下降对带宽的压力。通过多方讨论,咱们发现Oracle事实上已经作了这个工做,咱们一块儿来看看:code
咱们通过不断的探索,发现oracle树查询的最重要的就是select…start with…connect by…prior语法了。依托于该语法,咱们可以将一个表形结构以树的顺序列出来。blog
一、start with id= 是定义起始节点(种子)。可以是id也可以是root_id,定义为root_Id查询该节点下所有的树结构,定义为id(子节点)则查询指定的树递归
二、connect by prior :prior的含义为先前,前一条记录。prior id=root_id 也就是前一条记录的id等于当前记录的root_id(父id)
ip
一、查找一个节点的所有直属子节点(所有后代)。
select * from tb_menu m start with m.id=1 connect by m.parent=prior m.id;
这个查找的是id为1的节点下的所有直属子类节点,包含子辈的和孙子辈的所有直属节点。
二、查找一个节点的直属父节点(父亲)。
假设查找的是节点的直属父节点。也是不用用到树型查询的。
--c-->child, p->parent 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
三、查找一个节点的所有直属父节点(祖宗)。
select * from tb_menu m start with m.id=38 connect by prior m.parent=m.id;
select root_id,id,name,level from t2 where level=1 start with root_id = 0 connect by prior id = root_id;
经过这几天的观察。咱们发现,集体的智慧永远是最强大的,每个人贡献一点点,咱们就能将问题的解决方式在设计之初就升级到一个客观的程度,包含此次的树形结构的研究。相信你的队友不论他在你心理到底是什么状态,他既然被招进公司。确定有他的闪光点打动了人力部门。且另外一句话。高手在民间。这句话。已经屡次被验证了。