Loading

Oracle:递归查询

工作遇到,总结一下!

一:表结构、数据

 插入数据:

1
2
3
4
5
6
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);

 

 

 二.查询分部及其下面所有的部门:

1
2
3
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。

 

三.查询合肥分部及其上面所有的部门:

1
2
3
4
两种写法均可 :
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后面跟的是哪个字段,那么这个字段就作为后面递归查询的条件

 

四.死循环的解决办法

1
2
3
insert into org values(7,'A',9);
insert into org values(8,'B',7);
insert into org values(9,'C',8);

 当出现死循环时,使用上述查询语句会报错:

 可以使用关键字nocycle

1
SELECT* FROM org START WITH name = 'A' CONNECT BY nocycle id = PRIOR  parent_id;

  

posted @   秋风飒飒吹  阅读(664)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示