oracle中,有时候会遇到批量操作多级部门下的数据或者是多级类别下文档,一句sql搞定想要查询的数据,并对其增删改操作,如下:
查询某条数据下是否有子节点:
select * //要查询的字段
from table //具有子接点id和父接点id的表
start with childid=id数据 //给定一个开始查询的id(字段名为子接点id,以及开始的id数据)
connect by prior childid= pid //联接条件为子接点等于父接点
查询某条数据上是否有父节点:
select * //要查询的字段
from table //具有子接点id和父接点id的表
start with childid=id数据 //给定一个开始查询的id(字段名为子接点id,以及开始的id数据)
connect by prior pid= childid //联接条件为父接点等于子接点
from table //具有子接点id和父接点id的表
start with childid=id数据 //给定一个开始查询的id(字段名为子接点id,以及开始的id数据)
connect by prior pid= childid //联接条件为父接点等于子接点
实际举个例子,更好理解:
多级查询,数据结构如下:
a
b
c
d
e1
e2
db数据字段如下:
id name unit_id pid
-------------------------------------------------------
710 部门文档 527
1262 规章制度 527 710
2331 日常管理 527 710
2349 设备管理 527 710
2350 电梯 527 2349
2351 综合办公楼电梯 527 2350
2352 电梯保养作业报告 527 2351
2353 电梯维修报告 527 2351
12837 港口(建筑)设施维修管理 527 710
12838 港口主要设施 527 12837
12839 港口附属设施 527 12837
在上表中查找id=2351 相关联的所有的父节点以及所有的子节点数据,级联sql如下:
select t.* from OA_DEPT_DOC_TYPE t start with id='2351' connect by prior pid = id
UNION
select t.* from OA_DEPT_DOC_TYPE t start with id='2351' connect by prior id = pid
查询的结果如下:
id name unit_id pid
-----------------------------------------------
710 部门文档 527
2349 设备管理 527 710
2350 电梯 527 2349
2351 综合办公楼电梯 527 2350
2352 电梯保养作业报告 527 2351
2353 电梯维修报告 527 2351