示例代码
select id, substr(sys_connect_by_path(id, '/'), 2) deptallname
from tb_deptconfig where id = '8883547'
start with parent_id = '-1'
connect by prior id = parent_id
使用的sql函数
-
substr()
substr()函数:取得字符串中指定起始位置和长度的字符串 ,默认是从起始位置到结束的子串。
截取sys_connect_by_path(id, '/'), 从第二个参数到最后一个
substr()函数使用例子
substr('hello world',2,5) substr('目标字符串',开始位置,长度) //截取'hello world'第二个开始长度为5 -----------------结果='ello '(空格长度为1)
substr('hello world',2) //截取'hello world'从第二个开始到最后一个 ------------------结果='ello world' -
Oracle函数:sys_connect_by_path 主要用于树查询(层次查询) 以及 多列转行
select ... sys_connect_by_path(column_name,'connect_symbol') from table
start with ... connect by prio...
以下是我的理解
sys_connect_by_path(column_name,'/') column_name:递归需要拿到返回的列名 '/':通过'/'(用来分割结果级,可自定义)将递归得到的内容进行拼接.
红框内容(我的理解):通过递归得到的每层的id通过'/'进行拼接,拼接后的结果,通过substr来截取原内容第2个到最后一个.截取的内容 别名为 deptallname
start with:循环递归的根节点(我的理解就是从什么样的条件下开始递归)
以所查表父id不存在(即 parent_id='-1')为条件进行递归
connect by prio...:以什么样的条件进行递归(也就是说如果能满足这个条件就继续查找,查到无法满足这个条件的时候结束)
递归查询的条件为\现在查到的表的id为赋值给父id来查询下一个表(即id=parent_id),直到查不到下一个表结束
查询id为'8883547'的(id递归集)
[比如:这个表是一个部门的层级表,那这个语句就是查出id为'8883547'的部门,所在的所有部门层级的id拼接结果集]
很多都是个人理解来阐述,如果有不对的地方多多见谅,也希望能提出来让我也能更好的理解.