oracle 树查询

oracle 通过 START WITH...CONNECT BY PRIOR 语法实现树形查询,查询子节点与父节点,语法如下图:

start with:查询所用根节点,可以有多个
connect by:确定子节点与父节点的关系,如 
PRIOR  c1 = c2 c1为父节点,通过c2来查找c1
c1 = PRIOR c2 c2为父节点,通过c1来查找c2
cycle:
默认为 nocycle当树形查询为死循环时,会提示 " ORA-01436: CONNECT BY loop in user data"程序不执行
cycle, 当树形查询为死循环时,继续执行

其他
1. CONNECT_BY_ISLEAF伪列,当节点为叶节点时为1,否则为0
2. CONNECT_BY_ ROOT,查看字段的根节点,语法  CONNECT_BY_ ROOT COLUMN_NAME
3. SYS_CONNECT_BY_PATH,查看当前节点路径,语法  SYS_CONNECT_BY_PATH (column_name,'/')


example

id number ( 10 ) not null , --主键id
 
name varchar2 ( 50 ), --标题
 
parent number ( 10 ) --parent id
 
)

--父菜单
 
insert into map ( id , name , parent ) values ( 1 , '亚洲' , 0 );
 
insert into map ( id , name , parent ) values ( 2 , '北美洲' , 0 );
 
insert into map ( id , name , parent ) values ( 3 , '欧洲' , 0 );
 
 
--一级菜单
 
insert into map ( id , name , parent ) values ( 4 , '中国' , 1 );
 
insert into map ( id , name , parent ) values ( 5 , '韩国' , 1 );
 
insert into map ( id , name , parent ) values ( 6 , '日本' , 1 );
 
insert into map ( id , name , parent ) values ( 7 , '加拿大' , 2 );
 
insert into map ( id , name , parent ) values ( 8 , '美国' , 2 );
 
insert into map ( id , name , parent ) values ( 9 , '墨西哥' , 2 );
 
insert into map ( id , name , parent ) values ( 10 , '英国' , 3 );
 
insert into map ( id , name , parent ) values ( 11 , '法国' , 3 );
 
insert into map ( id , name , parent ) values ( 12 , '意大利' , 3 );

--二级菜单

insert into map ( id , name , parent ) values ( 13 , '广州' , 4 );
 
insert into map ( id , name , parent ) values ( 14 , '上海' , 4 );
 
insert into map ( id , name , parent ) values ( 15 , '北京' , 4 );
 
insert into map ( id , name , parent ) values ( 16 , '首尔' , 5 );
 
insert into map ( id , name , parent ) values ( 17 , ' 蔚山' , 5 );
 
insert into map ( id , name , parent ) values ( 18 , '釜山' , 5 );
 
insert into map ( id , name , parent ) values ( 19 , '东京' , 6 );
 
insert into map ( id , name , parent ) values ( 20 , '大阪' , 6 );
 
 
insert into map ( id , name , parent ) values ( 21 , '名古屋' , 6 );
 
insert into map ( id , name , parent ) values ( 22 , '渥太华' , 7 );
 
insert into map ( id , name , parent ) values ( 23 , '多伦多' , 7 );
 
insert into map ( id , name , parent ) values ( 24 , '温哥华' , 7 );
 
insert into map ( id , name , parent ) values ( 25 , '华盛顿' , 8 );
 
insert into map ( id , name , parent ) values ( 26 , '纽约' , 8 );
 
insert into map ( id , name , parent ) values ( 27 , '旧金山' , 8 );
 
insert into map ( id , name , parent ) values ( 28 , '墨西哥城' , 9 );
 
insert into map ( id , name , parent ) values ( 29 , '奇瓦瓦市' , 9 );
 
insert into map ( id , name , parent ) values ( 30 , '曼萨尼约港' , 9 );
 
insert into map ( id , name , parent ) values ( 31 , '伦敦' , 10 );
 
insert into map ( id , name , parent ) values ( 32 , '曼彻斯特' , 10 );
 
insert into map ( id , name , parent ) values ( 33 , ' 谢菲尔德' , 10 );
 
insert into map ( id , name , parent ) values ( 34 , '巴黎' , 11 );
 
insert into map ( id , name , parent ) values ( 35 , '马赛' , 11 );
 
insert into map ( id , name , parent ) values ( 36 , '里昂' , 11 );
 
insert into map ( id , name , parent ) values ( 31 , '佛罗伦萨' , 12 );
 
insert into map ( id , name , parent ) values ( 32 , '米兰' , 12 );
 
insert into map ( id , name , parent ) values ( 33 , ' 罗马' , 12 );
commit ;


select id ,name, parent,
CONNECT_BY_ISLEAF isleaf --是否是子节点
from map m
connect by nocycle prior m.parent=m.id --parent为父节点,nocycle死循环时不执行
start with m.id= 15 or m.id=33;

    ID NAME       PARENT     ISLEAF
------ ---------- ------ ----------
    15 北京            4          0
     4 中国            1          0
     1 亚洲            0          1
    33  谢菲尔德      10          0
    10 英国            3          0
     3 欧洲            0          1

select id ,name, parent,
CONNECT_BY_ISLEAF isleaf,
CONNECT_BY_ROOT parent root, --parent的根目录
SYS_CONNECT_BY_PATH(parent, '/') path --parent的路径
from map m 
connect by  m.parent= prior m.id
start with m.id=1;

    ID NAME       PARENT     ISLEAF       ROOT PATH
------ ---------- ------ ---------- ---------- ---------------
     1 亚洲            0          0          0 /0
     4 中国            1          0          0 /0/1
    13 广州            4          1          0 /0/1/4
    14 上海            4          1          0 /0/1/4
    15 北京            4          1          0 /0/1/4
     5 韩国            1          0          0 /0/1
    16 首尔            5          1          0 /0/1/5
    17  蔚山           5          1          0 /0/1/5
    18 釜山            5          1          0 /0/1/5
     6 日本            1          0          0 /0/1
    19 东京            6          1          0 /0/1/6
    20 大阪            6          1          0 /0/1/6
    21 名古屋          6          1          0 /0/1/6

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值