场景:
该表树状结构,第一层级得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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。