Oracle start with connect by prior 递归查询

基本语法

selectfrom tablename
where 条件1
start with 条件2
connect by 条件3(PRIOR);

条件1:相当于基本的筛选数据
条件2:递归查询起始条件
条件3:连接条件,其中用PRIOR表示上一条记录的结果作为本次查询的条件,比如:

CONNECT BY PRIOR id= parent_id;就是说上一条记录的id是本条记录的parent_id再进行查询(查子集);
CONNECT BY id= PRIOR parent_id;就是说上一条记录的parent_id是本条记录的id再进行查询(查父集);

实验场景

原始表数据:

对应关系图:

1.实验一:(查询自己及自己所有子集)

SELECT DISTINCT ID,level
        FROM org
        where DELETEFLAG =0 and ENABLEFLAG = 0
        START WITH id = 1
        CONNECT BY PRIOR ID=PARENTID

查询结果:

可以看出,查询出id为1的所有子集与他自己,查询过程:第一次查询为:id=1的;第二次查询为:PARENTID=第一次查询的id;第三次查询为:PARENTID=第二次查询的id

其中level可以看出树的层级

2.实验二:(进一步验证实验一)

SELECT DISTINCT ID,level
        FROM org
        where DELETEFLAG =0 and ENABLEFLAG = 0
        START WITH id = 10
        CONNECT BY PRIOR ID=PARENTID

查询结果:

查询出id为10的记录及其子集,并未查询其父集

3.实验三:(仅查询子集)

SELECT DISTINCT ID,level
        FROM org
        where DELETEFLAG =0 and ENABLEFLAG = 0
        START WITH parentid = 1
        CONNECT BY PRIOR ID=PARENTID

查询结果:

查询出id=1的子集,因为START WITH(初始条件)查询的是parentid = 1 的记录

4.实验四:(START WITH 后条件也可为多条件)

SELECT DISTINCT ID,level
        FROM org
        where DELETEFLAG =0 and ENABLEFLAG = 0
        START WITH (id=10 or id=2 or id=280)
        CONNECT BY PRIOR ID=PARENTID

查询结果:

发现查询结果与实验三一致

5.实验五:(查询自己及父集)

SELECT DISTINCT ID,level
        FROM org
        where DELETEFLAG =0 and ENABLEFLAG = 0
        START WITH id = 270
        CONNECT BY ID = PRIOR PARENTID

查询结果:

查询出自己及父集

6.实验六:(对查询结果 order by)

SELECT DISTINCT ID,level
        FROM org
        where DELETEFLAG =0 and ENABLEFLAG = 0
        START WITH id = 1
        CONNECT BY PRIOR ID=PARENTID
        order by level

查询结果:

证明,可以对查询后结果进行相关操作

7.实验七:(可以通过where条件筛选自己所需要的数据)

SELECT DISTINCT ID,level
        FROM org
        where DELETEFLAG =0 and ENABLEFLAG = 0
        and level!=3 
        START WITH id = 1
        CONNECT BY PRIOR ID=PARENTID

查询结果:

证明我们可以通过where 条件查询我们所需要的数据


结束

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

丿似锦

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

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

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

打赏作者

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

抵扣说明:

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

余额充值