数据库单表查询树状结构sql语句

本文介绍了如何使用Oracle的START WITH和CONNECT BY语句查询树形结构数据,例如从根节点查找所有子节点,或者从叶子节点查找所有祖先节点。通过示例展示了如何有效地检索河南下所有银行的详细信息,并利用lpad()函数和level伪列展示层级效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景:

该表树状结构,第一层级得id是第二层级的head。

我想把河南下的所有银行都查出来

bankid level    name            head      name

00017   1   中国银行河南省分行       00001   中国银行河南省分行
10951   2   中国银行郑州自贸区分行     00017   中国银行郑州自贸区分行
10952   3   中国银行郑州行政区支行     10951   中国银行郑州行政区支行
10953   3   中国银行郑州东明支行      10951   中国银行郑州东明支行
10954   3   中国银行郑州会展中心支行        10951   中国银行郑州会展中心支行
10955   3   中国银行郑州农业东路支行        10951   中国银行郑州农业东路支行
10957   3   中国银行郑州宝龙支行      10951   中国银行郑州宝龙支行
10958   3   中国银行郑州锦江花园支行        10951   中国银行郑州锦江花园支行
10959   3   中国银行郑州财富广场支行        10951   中国银行郑州财富广场支行
10960   3   中国银行郑州建业路支行     10951   中国银行郑州建业路支行
10963   3   中国银行郑州经四路支行     10951   中国银行郑州经四路支行

一开始用的是union

后来查了查有现成的语法,

-- 从根向叶子搜索
select * from oly_bank
start with bankid = '00017'
connect by prior bankid = head

-- 从叶子向根搜索
select * from oly_bank
start with bankid = '10953'
connect by prior head = bankid

完整语法:

{ CONNECT BY [ NOCYCLE ] condition [AND condition]... [ START WITH condition ]
| START WITH condition CONNECT BY [ NOCYCLE ] condition [AND condition]...}

解释:

start with: 指定起始节点的条件

connect by: 指定父子行的条件关系

prior: 查询父行的限定符,格式: prior column1 = column2 or column1 = prior column2 and ... ,

nocycle: 若数据表中存在循环行,那么不添加此关键字会报错,添加关键字后,便不会报错,但循环的两行只会显示其中的第一条

循环行: 该行只有一个子行,而且子行又是该行的祖先行

connect_by_iscycle: 前置条件:在使用了nocycle之后才能使用此关键字,用于表示是否是循环行,0表示否,1 表示是

connect_by_isleaf: 是否是叶子节点,0表示否,1 表示是

level: level伪列,表示层级,值越小层级越高,level=1为层级最高节点

搜索结果用lpad()函数和伪列level结合起来更能表现出层级效果哦

select bankid, lpad(' ',level*2,' ')||, banklevel, head from oly_bank 
start with bankid = '00017'
connect by prior bankid = head

1   00017   1     中国银行河南省分行          1   00001
2   10951   2       中国银行郑州自贸区分行     2   00017
3   10952   3         中国银行郑州行政区支行   3   10951



作者:晨风小菜鸟成长日记
链接:https://www.jianshu.com/p/f525d1457908
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值