Oracle高级查询之CONNECT BY

数据库技术学习 https://www.itkc8.com

Oracle中的select语句可以用start with ... connect by prior ...子句实现递归查询,connect by 是结构化查询中用到的,其基本语法是:

select ... from
where <过滤条件,用于对返回的所有记录进行过滤>
start with <根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树>
connect by [prior] <连接条件,其中用prior表示上一条记录,比如:connect by prior t.id = t.parent_id就是说上一条记录的id 是本条记录的parent_id,即本记录的父亲是上一条记录> 
下面我们直接来看实例,查询'KING'的所有下属雇员。SQL语句如下:

select * from scott.emp e
 	start with e.ename = 'KING'
	connect by prior e.empno = e.mgr;

我突然想起了树形结构

我们再来看另外一个实例,反过来查询'SMITH'的所有上司。SQL语句如下

select * from scott.emp e
 	start with e.ename = 'SMITH'
	connect by e.empno = prior e.mgr;

通过上面的两个实例,估计大家应该理解的差不多了,接下来介绍connect by的几个固定搭档。
1、sys_connect_by_path函数
语法:sys_connect_by_path(列名, '分隔符')。
作用:从start with的地方开始遍历,将遍历到的路径根据函数中的分隔符,组成一个新的字符串。

select sys_connect_by_path(ename, '/') ename_tree from scott.emp
 	start with ename = 'KING'
	connect by mgr = prior empno;

插个题外话,介绍sys_connect_by_path函数使用的一个小技巧,把查询行转换成列,把表emp的所有列名以'|'分隔开输出(提示:大家可以把下面的语句拆开来逐个分析),SQL语句如下:

select max(ltrim(sys_connect_by_path(column_name, '|'), '|')) column_names from (select column_name, rownum rnum
          from user_tab_columns
         where table_name = 'EMP')
 start with rnum = 1
connect by rnum = rownum;

2、level:在结构化查询结果中,每一行都是结构中的一个节点,level表示该节点在结构中的层次,根节点为1,根节点的子节点为2,以此类推。
下面SQL语句很直观的展示效果:

select ename, sys_connect_by_path(ename, '/') ename_tree, level
  from scott.emp
 start with ename = 'KING'
connect by mgr = prior empno;

3、connect_by_root:用在列名之前,返回当前节点的根节点对应列的值。connect_by_isleaf:返回当前节点是否为叶子节点,“是”返回1,“否”返回0。
下面SQL语句很直观的展示效果:

select sys_connect_by_path(ename, '/') ename_tree,
       connect_by_root ename as root,
       connect_by_isleaf as isleaf
  from scott.emp e
 start with e.ename = 'KING'
connect by prior e.empno = e.mgr;


数据库技术学习 https://www.itkc8.com

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值