Oracle树查询(查询所有子节点,父节点等等)
转载地址:http://blog.csdn.net/ye_renjie/article/details/52701914
Oracle树查询的最重要的就是select...start with... connect by ...prior语法了。依托于该语法,我们可以将一个表形结构的中以树的顺序列出来。在下面列述了Oracle中树型查询的常用查询方式以及经常使用的与树查询相关的特性函数等,在这里只涉及到一张表中的树查询方式而不涉及多表中的关联等。 Sql代码 1. 2. 3. 4. 7.
我们从最基本的操作,逐步列出树查询中常见的操作,所以查询出来的节点以家族中的辈份作比方。 SELECT*FROMflflWHEREsjflidIS; 这是个引子,没用到树型查询。 2.查找一个节点的直属子节点(所有儿子)。如果查找的是直属子类节点,也是不用用到树型查询的。 sjflid = 819459; 这个可以找到819459的直属子类节点。 3.查找一个节点的所有直属子节点(所有后代)。 flfl STARTWITHID = 819459CONNECTBYsjflid =PRIORID; 这个查找的是的节点下的所有直属子类节点,包括子辈的和孙子辈的所有直属节点。 4.查找一个节点的直属父节点(父亲)。如果查找的是节点的直属父节点,也是不用用到树型查询的。 b.*flfl aJOINflfl bONa.sjflid = b.IDa.ID = 6758; 这个找到的是6758的节点的直属父节点,要用到同一张表的关联了。 5.查找一个节点的所有直属父节点(祖宗)。 ID = 6758BYsjflid = ID; 这里查找的就是的所有直属父节点,打个比方就是找到一个人的父亲、祖父等。但是值得注意的是这个查询出来的结果的顺序是先列出子类节点再列出父类节点,姑且认为是个倒序吧。 以下是一系列针对树结构的更深层次的查询,这里的查询不一定是最优的查询方式,或许只是其中的一种实现而已。 6.查询一个节点的兄弟节点(亲兄弟)。 a.* 3. 这里查询的就是与6757的节点同属一个父节点的节点了,就好比亲兄弟了。 7.查询与一个节点同级的节点(族兄弟)。如果在表中设置了级别的字段,上表中的FLJB,那么在做这类查询时会很轻松,同一级别的就是与那个节点同级的,在这里列出不使用该字段时的实现! tmpAS 6. 8. 8.查询一个节点的父节点的的兄弟节点(伯父与叔父)。 ID) b.* tmp b,154); background:transparent">8. 11. 12. 16. 21. 9.查询一个节点的父节点的同级节点(族叔)。 这个其实跟第种情况是相同的。 ID = 819394) - 1 只需要做个级别判断就成了。 基本上,常见的查询在里面了,不常见的也有部分了。其中,查询的内容都是节点的基本信息,都是数据表中的基本字段,但是在树查询中还有些特殊需求,是对查询数据进行了处理的,常见的包括列出树路径等。 下面列出的是一些与树相关的特殊需求。 10.名称要列出名称全部路径。 这里常见的有两种情况,一种是是从顶级列出,直到当前节点的名称(或者其它属性);一种是从当前节点列出,直到顶级节点的名称(或其它属性)。举地址为例:国内的习惯是从省开始、到市、到县、到居委会的,而国外的习惯正好相反(老师说的,还没接过国外的邮件,谁能寄个瞅瞅)。 从顶部开始: START5. 4. 11.列出当前节点的根节点。 在前面说过,根节点就是start with开始的地方。 connect_by_root函数用来列的前面,记录的是当前节点的根节点的内容。 12.列出当前节点是否为叶子。 这个比较常见,尤其在动态目录中,在查出的内容是否还有下级节点时,这个函数是很适用的。 (编辑:岳阳站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |