Oracle中start with connect by用法

本文介绍如何使用Oracle数据库中的startwith和connectbyprior函数来实现递归查询,以找出表中数据的父子关系。通过几个具体例子展示了如何查找员工间的上下级关系,并以不同格式展示查询结果。

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

找出表中数据的父子关系,oracle提供了start with connect by prior函数来实现递归查询,其基本语法是:

select …… from tablename

where conditional-1

start with conditional-2

connect by prior conditional-3

例1:找到员工miller的所有上级

    SELECT   level, e.*

        FROM  empe

STARTWITH   ename='miller'

CONNECTBY  PRIOR mgr=empno;

结果


结果表明miller的上司为clark,clark的上司为king。由于king是公司的负责人因此其mgr为null。


例2:如果想要将结果表示为miller-->clark-->king可使用如下语句进行求解。

    SELECT   LTRIM (SYS_CONNECT_BY_PATH(ename,'-->'),'-->')

               leaf__branch_____root

        ROM   emp

            WHERE  LEVEL=3

STARTWITH  ename='miller'

CONNECTBY  PRIOR mgr=empno;

结果(没有where语句时结果为左图,添加where语句后结果为右图。)


例3:返回整个公司员工的层次关系。

    SELECT   LTRIM (SYS_CONNECT_BY_PATH(ename,'- '),' - ')emp_tree

        FROM   emp

STARTWITH   mgrISNULL

CONNECTBY  PRIOR empno=mgr

       ORDER BY   1;

结果

本例中start with定义了根行,由于king是公司的经理没有上司,因此其mgr字段为null;connect by子句返回了层次中符合条件的行。


例4:对例3中的结果换一种展示方式:

    SELECT   LPAD ('',LEVEL*2-1) ||SYS_CONNECT_BY_PATH(ename,'=>')

               emp_tree

      FROM   emp

STARTWITH   mgrISNULL

CONNECTBY  PRIOR empno=mgr;

结果



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值