前两天在写SQL的时候 无意间发现这样一条语句 我得天呐 我都惊讶了 还能这样搞的 以前用MYSQL的时候 像菜单这种层级查询的话还要去查询每一条 然后再进行一个递归 封装 麻烦的一* Oracle竟然一条语句就搞定了 这不赶紧偷过来 (奇怪 读书人的事怎么能叫偷呢)
select CONNECT_BY_ROOT(字段) 根节点,level 层级,connect_by_isleaf 是否叶子节点
from table_name t
START WITH [条件(以哪个节点开始)]
CONNECT BY t.所属 = PRIOR t.名称 order siblings by t.所属 desc;
说明:
-
start with :设置起点 就是从哪个节点开始查,省略后默认以全部行为起点。
-
connect by [condition] :与一般的条件一样作用于当前列,但是在满足条件后,会以全部列作为下一层级递归(没有其他条件的话)。
-
prior : 表示上一层级的标识符。经常用来对下一层级的数据进行限制。不可以接伪列。
PRIOR:prior在等号哪边,表示哪边是"我的"
举个🌰 :
找下属: prior(“我的”) employee_id = "别人的"manager_id --> 找出我的下属 (向下查询)
找上司: employee_id = prior manager_id 别人的工号 = 我的经理编号 --> 别人是我的经理 & 别人是我经理的经理 --> 我的上司们
-
level :伪列,表示当前深度。
-
connect_by_root() :显示根节点列。经常用来分组。
-
connect_by_isleaf :1是叶子节点,0不是叶子节点。在制作树状表格时必用关键字。
-
sys_connect_by_path() :将递归过程中的列进行拼接。
-
nocycle , connect_by_iscycle : 在有循环结构的查询中使用。
-
siblings : 保留树状结构,对兄弟节点进行排序
转载自:
https://blog.csdn.net/nayi_224/article/details/79811185
https://www.pianshen.com/article/540440773/
https://www.jianshu.com/p/f6f8707ff93b