工作遇到,总结一下!
一:表结构、数据
插入数据:
insert into org values(1,‘总部‘,null); insert into org values(2,‘分部‘,1); insert into org values(3,‘安徽分部‘,2); insert into org values(4,‘江苏分部‘,2); insert into org values(5,‘合肥分部‘,3); insert into org values(6,‘南京分部‘,4);
二.查询分部及其下面左右的部门:
两种写法均可 : SELECT* FROM org START WITH name = ‘分部‘ CONNECT BY PRIOR id = parent_id; SELECT* FROM org START WITH name = ‘分部‘ CONNECT BY parent_id = PRIOR id ;
注意:prior后面紧跟的参数是id,意味查询name=‘分部‘的部门的id作为后面递归查询的条件,即后面的部门的parent_id要等于查询出来的id。
三.查询合肥分部及其上面所有的部门:
两种写法均可 : SELECT* FROM org START WITH name = ‘合肥分部‘ CONNECT BY id = PRIOR parent_id; SELECT* FROM org START WITH name = ‘合肥分部‘ CONNECT BY PRIOR parent_id = id ;
注意:prior后面紧跟的参数是parent_id,意味查询name=‘合肥分部‘的部门的parent_id作为后面递归查询的条件,即后面的部门的id要等于查询出来的parent_id。
记住一点:prior后面跟的是哪个字段,那么这个字段就作为后面递归查询的条件
四.死循环的解决办法
insert into org values(7,‘A‘,9); insert into org values(8,‘B‘,7); insert into org values(9,‘C‘,8);
当出现死循环时,使用上述查询语句会报错:
可以使用关键字nocycle
SELECT* FROM org START WITH name = ‘A‘ CONNECT BY nocycle id = PRIOR parent_id;