oracle的级联查询connect by

connect by可以用于级联查询,常用于对具有树状结构的记录查询某一节点的所有子孙节点或所有祖辈节点。

造测试数据如下:

CREATE TABLE t_menu (
id int,
name varchar(20),
parent_id int)


INSERT INTO t_menu values(1,'菜单01',0);
INSERT INTO t_menu values(2,'菜单02',0);
INSERT INTO t_menu values(3,'菜单03',0);
INSERT INTO t_menu values(4,'菜单0101',1);
INSERT INTO t_menu values(5,'菜单0102',1);
INSERT INTO t_menu values(6,'菜单0103',1);
INSERT INTO t_menu values(7,'菜单010101',4);
INSERT INTO t_menu values(8,'菜单010201',5);
INSERT INTO t_menu values(9,'菜单010301',6);
INSERT INTO t_menu values(10,'菜单0201',2);
INSERT INTO t_menu values(11,'菜单0202',2);
INSERT INTO t_menu values(12,'菜单020101',10);
INSERT INTO t_menu values(13,'菜单020102',10);

select * from table [start with condition1] connect by [prior] id=parentid

--start with和connect by 先后顺序不影响结果

start with condition1 是用来限制第一层的数据,或者叫根节点数据;以这部分数据为基础来查找第二层数据,然后以第二层数据查找第三层数据以此类推。

connect by [prior] id=parentid 这部分是用来指明oracle在查找数据时以怎样的一种关系去查找;比如说查找第二层的数据时用第一层数据的id去跟表里面记录的parentid字段进行匹配,如果这个条件成立那么查找出来的数据就是第二层数据,同理查找第三层第四层…等等都是按这样去匹配。
 

理解prior的含义:就是以prior测的字段作为关联字段查询,比如查询id 和parentid,我要查01的所有子节点,那么把查出来的第一层数据的id作为parentid去查第二层,那么就是把id测加prior

可以理解为子节点的竖向查询

select * from t_menu connect by parent_id=prior id start with id=1;  

 如果想查找“菜单01”下的子孙菜单,但是不包括“菜单01”本身,那么就限制parentid

select * from t_menu connect BY  parent_id= PRIOR id start with parent_id=1;  

 如果以parentid 作为prior 的字段,那么就是父节点的横向查询

select * from t_menu connect BY PRIOR parent_id=  id start with parent_id=1;  

connect_by_isleaf

       connect_by_isleaf也是一个伪列,其表示对应的记录是否是一个叶子节点,即在进行connect by时不能通过该记录找到下一条记录。其对应的值有0和1,0表示非叶子节点,1表示是叶子节点。叶子就是最末尾,没有继续往下延伸的那条记录。

如我只想找出是叶子节点的菜单时对应的SQL可以这样写:参考文章:

 select * from t_menu where connect_by_isleaf = 1 connect by parent_id=prior id start with id=1;  

 

树概念及使用connect by进行级联查询 - 码农教程

Oracle递归查询connect by用法_oracle_脚本之家

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大宇进阶之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值