Oracle树查询总结

最近在做公司的项目中遇到一个问题,多级级联导航菜单,虽然只有三级目录,但<li>中嵌套<ul>,数据库表结构如下:

CREATE TABLE FLFL   
(   
ID NUMBER NOT NULL,   
MC NVARCHAR2(20),   
FLJB NUMBER,   
SJFLID NUMBER   
)

很常见的表结构,包括自身ID和父ID,对于这种我们已不陌生,在写树状菜单的时候经常见到这样的数据结构,但是我们一般写树状菜单的时候都会用到前端的框架比如zTree或者treeView等,我们只要在后台查出所有的数据,返回List到前台前台会根据id和superId自动解析成树状结构。但如果不用这些框架的话,就需要我们自己在后台组装成树结构返回前台做处理。那么后台如何组装树结构呢,比如要实现如下功能:

这个时候就要用到数据库的树查询方法。树查询返回的数据结构就是查出根节点下的全部子子孙孙的节点以节点包含节点的方式展现。

Oracle树查询的主要语法:select...start with... connect by ...prior 。

我们以上述FLFL表为例进行讲解.

1. 查找树中的所有顶级父节点(辈份最长的人)。

SELECT * FROM flfl WHERE sjflid =0;

以上查询中所有的根节点的上级Id也就是父Id都为0,这个在插入数据的时候就可以进行设定。根节点以父Id为0进行标识。

2.查找一个节点的直属子节点(所有儿子)。

SELECT * FROM flfl WHERE sjflid = 819459;

3.查找一个节点的所有 直属子节点(所有后代)。

SELECT * FROM flfl START WITH ID = 819459 CONNECT BY sjflid = PRIOR ID; 

这个查找的是ID为819459的节点下的所有直属子类节点,包括子辈的和孙子辈的所有直属节点。

4.查找一个节点的直属父节点(父亲)。

 SELECT b.* FROM flfl a JOIN flfl b ON a.sjflid = b.ID WHERE a.ID = 6758; 

这个找到的是ID为6758的节点的直属父节点,要用到同一张表的关联了。

参照来源:https://www.cnblogs.com/ao-xiang/p/5790342.html

原文地址:https://www.cnblogs.com/xianfengzhike/p/9210264.html