Oracle:递归树形结构查询功能
概要
树状结构通常由根节点、父节点(PID)、子节点(ID)和叶节点组成。
查询语法
SELECT [LEVEL],*
FROM table_name
START WITH 条件1
CONNECT BY PRIOR 条件2
WHERE 条件3
ORDER BY 排序字段
说明:LEVEL—伪列,用于表示树的层次(用于查询结果所在层次,根节点的层次为1)
条件1—根节点的限定条件,当然也可以放宽权限,以获得多个根节点,也就是获取多个树(即:start with 后面的条件表示递归从哪里开始。)
条件2—连接条件,目的就是给出父子之间的关系是什么,根据这个关系进行递归查询(即:递归时前后两条数据是以条件2来建立联系的)
条件3—过滤条件,对所有返回的记录进行过滤。
排序字段—对所有返回记录进行排序
prior使用
prior的位置决定了递归时的具体关系或者说是决定了查询时的检索顺序,prior 字段1=字段2 可以理解为当前节点的字段1等于下一个节点的字段2。
两种写法:
connect by prior dept_id=par_dept_id 表示采用自上而下的搜索方式(先找父节点然后找子节点)
connect by dept_id=prior par_dept_id 表示采用自下而上的搜索方式(先找叶子节点然后找父节点)
举例
语法:
select
from 表名 t
where 过滤条件
start with t.PID=xx --开始根节点
connect by prior t.ID=t.PID
SELECT t.JGBHFROM GG_JGBH twhere SYBZ = 1START WITH t.SJJG = (select SJJG from GG_JGBH where JGBH = '0001')
CONNECT BY PRIOR t.JGBH = t.SJJG
但上速查询的内容不包括“开始根节点”所对应的数据,此时我的解决方式是使用OR来关联
select E_ADDRESS.*, (select jgmc from gg_jgbh where jgbh = account) jgmcfrom E_ADDRESSwhere ACCOUNT = (select SJJG from GG_JGBH where JGBH = '0001')or ACCOUNT in(SELECT t.JGBHFROM GG_JGBH twhere SYBZ = 1START WITH t.SJJG = (select SJJG from GG_JGBH where JGBH = '0001')CONNECT BY PRIOR t.JGBH = t.SJJG)
引用文章
http://www.dbs724.com/10240.html
https://blog.csdn.net/lwh_zfj/article/details/90180260