Oracle树状结构

在做页面目录、城市地区、商品分类等数据库的设计的时候,经常会用到PID(父级ID)这个字段,

MySQL通过添加Lavel、Path等辅助字段,使用FIND_IN_SET语句,可以轻松地进行级联删除,级联查询,

而Oracle使用内置函数,在不添加额外的前提下,就能轻松地实现这个功能,代码如下:

SELECT T."ID", T.PID, T."NAME", LEVEL 
FROM TY_FUNCTION_SYS T
WHERE T.PID != 1
START WITH T.PID = 0
CONNECT BY PRIOR "ID" =  PID
ORDER BY LEVEL ASC;

/*
select * from some_table [where 条件1] connect by [条件2] start with [条件3]; 
其中 connect by 与 start with 语句摆放的先后顺序不影响查询的结果,[where 条件1]可以不需要。 
[where 条件1]、[条件2]、[条件3]各自作用的范围都不相同: 

[where 条件1]是在根据“connect by [条件2] start with [条件3]”选择出来的记录中进行过滤,是针对单条记录的过滤, 不会考虑树的结构; 

[条件2]指定构造树的条件,以及对树分支的过滤条件,在这里执行的过滤会把符合条件的记录及其下的所有子节点都过滤掉; 

[条件3]限定作为搜索起始点的条件,如果是自上而下的搜索则是限定作为根节点的条件,如果是自下而上的搜索则是限定作为叶子节点的条件;

prior存在于[条件2]中,表示是否继续查询子节点,有两种写法:
connect by prior t.p_id=t.id : 表示采用自上而下的搜索方式(先找父节点然后找子节点) 
connect by t.p_id=prior t.id : 表示采用自下而上的搜索方式(先找叶子节点然后找父节点)。 
*/
原文地址:https://www.cnblogs.com/chenss15060100790/p/9123401.html