sys_connect_by_path 用法

个人觉得这个函数其实很好用,sys_connect_by_path(字段名, 2个字段之间的连接符号),注意这里的连接符号不要使用逗号,oracle会报错,如果一定要用,可以使用replace替换一下,方法如下 REPLACE(字段名,原字符,',')。
还有,这个函数使用之前必须先建立一个树,否则无用。
举个例子:
目的:将num值相等的项目写成 seq1,seq2,seq3,……的形式
(SELECT num,REPLACE(MAX(sql0), ';', ',')
                         FROM (SELECT num, sys_connect_by_path(sql1, ';') AS sql0
                              FROM (SELECT num, sql1, rn, lead(rn) over(PARTITION BY num ORDER BY rn) rn1
                                       FROM (SELECT num, sql1, row_number() over(ORDER BY num, sql1 DESC) rn FROM tlsbk))
                              START WITH num = '1' AND rn1 IS NULL
                               CONNECT BY rn1 = PRIOR rn));
结果:
num REPLACE(MAX(sql0), ';', ',')
--------------------------------------------------------
1 sql0,sql1,sql2
2 sql20,sql21,sql23,sql24,sql25
3 sql30,sql31,sql32,sql33,sql34,sql35,sql36

树结构和它的专用函数SYS_CONNECT_BY_PATH(网摘:http://blog.oracle.com.cn/html/83/t-122083.html)
简单的树型结构
关于树的普通应用
学习了下这个函数, 用ORGINDUSTRIES的表做了个测试:
正常的树型结构
select lpad(' ',6*(level-1))||industry,indlevel,indid,pindid
from ORGINDUSTRIES
start with indid=1
connect by pindid=prior indid
结果显示如下
                Indlevel   indid pindid
       服装与服饰             1          1          0
             服装             2          2             1
                   女装        3          3             2

倒型树
下面这个例子是个”倒数”—倒过来的树型结构
select lpad(' ',6*(level-1))||industry,indlevel,indid,pindid
from ORGINDUSTRIES
start with indid=20
connect by indid=prior pindid;
这是标准结果:
                            Indlevel indid pindid
二手服装                   3        20    2
   服装                    2        2        1
         服装与服饰        1        1        0
结论
无论正树还是倒树, 关键就在于connect by的条件.
正树:   必须是   ‘父’= prior ‘子’
倒树:   必须是   ‘子’= prior ‘父’

树型结构的条件过滤
采用树型结构的话, 如果我们想将树上的一个分支砍掉.   将分支后面的结构都抛弃掉, 这个可以实现麽?当然可以。 但是不是用where, where条件只能去除单一的条件。
所以, 这种树型的过滤条件就需要加在connect by上面。

测试如下:由于用真实环境比较贴近实际,所以提前用下SYS_CONNECT_BY_PATH函数来显示下环境

不加任何条件的环境:
select areaname,sys_connect_by_path(areaname,',')
from areas bb
start with areaname='中国大陆'
connect by parentareaid=prior areaid 

结果:
1        中国大陆,中国大陆
2        北京        ,中国大陆,北京
3        北京        ,中国大陆,北京,北京
4        东城区        ,中国大陆,北京,东城区
5        西城区        ,中国大陆,北京,西城区
22        广东        ,中国大陆,广东
23        广州        ,中国大陆,广东,广州
24        汕尾        ,中国大陆,广东,汕尾
25        潮阳        ,中国大陆,广东,潮阳
46        上海        ,中国大陆,上海
47        上海        ,中国大陆,上海,上海
48        黄浦区        ,中国大陆,上海,黄浦区
49        闸北区        ,中国大陆,上海,闸北区


加了where过滤条件的SQL:
select areaname,sys_connect_by_path(areaname,',')
from areas bb
where bb.areaid>861000
start with areaname='中国大陆'
connect by parentareaid=prior areaid

结果为:
2        北京        ,中国大陆,北京
3        北京        ,中国大陆,北京,北京
4        东城区        ,中国大陆,北京,东城区
5        西城区        ,中国大陆,北京,西城区
22        广东        ,中国大陆,广东
23        广州        ,中国大陆,广东,广州
24        汕尾        ,中国大陆,广东,汕尾
25        潮阳        ,中国大陆,广东,潮阳
46        上海        ,中国大陆,上海
47        上海        ,中国大陆,上海,上海
48        黄浦区        ,中国大陆,上海,黄浦区
49        闸北区        ,中国大陆,上海,闸北区

结论:去掉了“1        中国大陆,中国大陆”数据

加了connect by的过滤条件:
select areaname,sys_connect_by_path(areaname,',')
from areas bb
where bb.areaid>861000
start with areaname='中国大陆'
connect by parentareaid=prior areaid   and areaname<>'广东'

结果为:
2        北京        ,中国大陆,北京
3        北京        ,中国大陆,北京,北京
4        东城区        ,中国大陆,北京,东城区
5        西城区        ,中国大陆,北京,西城区
46        上海        ,中国大陆,上海
47        上海        ,中国大陆,上海,上海
48        黄浦区        ,中国大陆,上海,黄浦区
49        闸北区        ,中国大陆,上海,闸北区

结论:去掉了整个广东的分支,   在结果集中只有北京和上海


SYS_CONNECT_BY_PATH函数
采用SYS_CONNECT_BY_PATH函数为:

select industry,sys_connect_by_path(industry,'/')
from ORGINDUSTRIES
start with indid=3
connect by indid=prior pindid;

结果为:
女装             /女装
服装             /女装/服装
服装与服饰          /女装/服装/服装与服饰

这样的话, 就可以实现, 树结构的结果集的单行拼接:

我们只需要取最大的字段就OK了

测试如下:

select max(sys_connect_by_path(industry,'/'))
from ORGINDUSTRIES
start with indid=3
connect by indid=prior pindid;

结果为:
/女装/服装/服装与服饰


复杂的树型结构――多列变单列
树型结构也分单树和多树(我的称呼,实际上就是指单支和多支)
对于下面的这种情况, 我们必须要构造的树就属于单支树。
原始环境
环境如下:
select * from test;

结果为:
1        n1
1        n2
1        n3
1        n4
1        n5
3        t1
3        t2
3        t3
3        t4
3        t5
3        t6
2        m1

造树
脚本如下:
select no,q,
   no+row_number() over( order by no) rn,
   row_number() over(partition by no order by no) rn1
from test

结果如下:
No   Q   RN RN1
1        n1        2        1
1        n2        3        2
1        n3        4        3
1        n4        5        4
1        n5        6        5
2        m1        8        1
3        t1        10        1
3        t2        11        2
3        t3        12        3
3        t4        13        4
3        t5        14        5
3        t6        15        6

每列的目的是:
RN1列主要的目的是分组, 按照value值‘1’,我们可以start with使用它。

RN列主要用来做connect by使用。 实际上它就是我们要的树。
第一个支: 2,3,4,5,6
第二个支: 8
第三个支: 10,11,12,13,14,15

中间为什么要断掉:7,9   目的就是为了区别每个分支。 到后面看具体的SQL,就明白这里的说法了。

杀手锏
既然我们有了树, 就可以使用树型函数SYS_CONNECT_BY_PATH和connect by啦,来拼接我们所需要的多列值。

脚本如下:
select no,sys_connect_by_path(q,',')
from (
select no,q,
   no+row_number() over( order by no) rn,
   row_number() over(partition by no order by no) rn1
from test
)
start with rn1=1
connect by rn-1=prior rn

结果为:
1        ,n1
1        ,n1,n2
1        ,n1,n2,n3
1        ,n1,n2,n3,n4
1        ,n1,n2,n3,n4,n5
2        ,m1
3        ,t1
3        ,t1,t2
3        ,t1,t2,t3
3        ,t1,t2,t3,t4
3        ,t1,t2,t3,t4,t5
3        ,t1,t2,t3,t4,t5,t6

终极武器
最终我们要的值,是单列值, 其实想想, 也就是最长的一行咯。 那么就好办了。 我们直接GROUP BY ,然后取MAX值。
脚本如下:
select no,max(sys_connect_by_path(q,','))
from (
select no,q,
   no+row_number() over( order by no) rn,
   row_number() over(partition by no order by no) rn1
from test
)
start with rn1=1
connect by rn-1=prior rn
group by no

结果为:
1        ,n1,n2,n3,n4,n5
2        ,m1
3        ,t1,t2,t3,t4,t5,t6

如果觉得前面的‘,’不好看,可以使用ltrim去掉。 或者用substr也可以。
如下:
ltrim(max(sys_connect_by_path(q,',')),',')
或者
substr(max(sys_connect_by_path(q,',')),2)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497716.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css怎样定义div大小,css如何设置div大小

在css中&#xff0c;可以使用width属性和height属性来设置div大小&#xff0c;只需要给div元素设置“width:值”和“height:值”样式即可。width属性定义元素内容区的宽度&#xff0c;height属性定义元素内容区的高度。本教程操作环境&#xff1a;windows7系统、CSS3&&…

年终重磅:解密全球30家搅局者和355家上市路上的科技公司

来源&#xff1a;智东西概要&#xff1a;科技IPO的一大趋势就是上市公司数量减少&#xff0c;有了巨轮融资的支持&#xff0c;他们保持私有性的时间更久。2017年科技板风投较2016年的低迷呈复苏趋势&#xff0c;百万级交易&#xff08;mega-rounds&#xff09;回暖&#xff0c;…

javascript 数字精度问题

来源&#xff1a;http://rockyee.iteye.com/blog/891538 摘要&#xff1a; 由于计算机是用二进制来存储和处理数字&#xff0c;不能精确表示浮点数&#xff0c;而JavaScript中没有相应的封装类来处理浮点数运算&#xff0c;直接计算会导致运算精度丢失。 为了避免产生精度差…

如何在js中使用ajax请求数据,在 JS 中怎么使用 Ajax 来进行请求

在 JS 中怎么使用 Ajax 来进行请求发布时间&#xff1a;2021-07-22 09:48:43来源&#xff1a;亿速云阅读&#xff1a;78作者&#xff1a;chen本篇内容介绍了“在 JS 中怎么使用 Ajax 来进行请求”的有关知识&#xff0c;在实际案例的操作过程中&#xff0c;不少人都会遇到这样的…

5G年终盘点 | 2017年里的9个“万万没想到”

来源&#xff1a;华为概要&#xff1a;回首2017&#xff0c;5G的发展可谓风起云涌&#xff0c;我们一次次地被刷新着认知&#xff0c;感叹5G的奇妙。时光荏苒&#xff0c;白驹过隙&#xff0c;转眼就到了年底。回首2017&#xff0c;5G的发展可谓风起云涌&#xff0c;我们一次次…

java 数字计算精度问题

问题的提出&#xff1a; 编译运行下面这个程序会看到什么&#xff1f; public class Test{ public static void main(String args[]){ System.out.println(0.050.01); System.out.println(1.0-0.42); System.out.println(4.015*100); …

idc服务器管理系统勇士水花,idc管理系统

该系统可实现供配电、UPS、空调、温湿度、消防、安防、漏水检测、视频等环境保障设备的机房系统。机房内各设备的可靠与否直接关系着网络、服务器等设备能否正常、持久、稳定的运行&#xff0c;因此机房环境动力监控系统得到了日益广泛的应用&#xff0c;不仅提高设备的维护管理…

透视 CES 2018:不容错过的四大科技趋势

来源&#xff1a;新智造概要&#xff1a;物理与数字世界正走向融合&#xff0c;我们每天醒来的时间、睡眠时长、心率和步数等数据都会被分享、上传并转化为分析数据。物理与数字世界正走向融合&#xff0c;我们每天醒来的时间、睡眠时长、心率和步数等数据都会被分享、上传并转…

单片机wifi模块与服务器通信协议,单片机常用的几种通信协议

在单片机的应用中&#xff0c;通信协议是其中必不可少的一部分&#xff0c;上位机与下位机&#xff0c;单片机与单片机&#xff0c;单片机与外设模块之间的通信都需要通信协议实现信息交换和资源共享。由于设备之间不同的传输速率、电气特性、可靠性要求的不同&#xff0c;也产…

Axis2;wsdl生成客户端和serverJava代码

来源&#xff1a;http://blog.csdn.net/ouyangtianhan/article/details/6779528 1.安装JDK6 并设置环境变量 JAVA_HOME,path,class 本文的安装路径为: D:\Tools\JDK6 故设置&#xff1a;JAVA_HOMED:\Tools\JDK6 path%JAVA_HOME%\bin; classpath.;%JA…

Gartner预测:2025年,人工智能将创造200万个新增就业机会

来源&#xff1a;人工智能和大数据概要&#xff1a;对于与人工智能&#xff08;AI&#xff09;有关的就业动态来讲&#xff0c;2020年将是极其重要的一年&#xff0c;人工智能将带动整体工作机会的正增长。对于与人工智能&#xff08;AI&#xff09;有关的就业动态来讲&#xf…

安装服务器系统多少钱,服务器系统安装费用

服务器系统安装费用 内容精选换一换安装完操作系统后的临时云服务器还需要进行相关配置&#xff0c;并安装云平台提供的Guest OS driver&#xff0c;才能保证后续创建的云服务器正常使用。Guest OS driver包括VMTools驱动和PV driver&#xff0c;在前面步骤中已为云服务器安装V…

未来15年,人工智能将带给城市8种改变

来源&#xff1a;微软研究院概要&#xff1a;如果到了2030年&#xff0c;人工智能将给北美城市的面貌带来怎样的平均标准变化呢&#xff1f;如果到了2030年&#xff0c;人工智能将给北美城市的面貌带来怎样的平均标准变化呢&#xff1f;专家们对人工智能进行了一个世纪的研究&a…

axis2 webservice入门学识(JS,Java,PHP调用实例源码)

来源&#xff1a;http://www.myexception.cn/web/952419.html axis2 webservice入门知识(JS,Java,PHP调用实例源码)背景简介最近接触到一个银行接口的案子&#xff0c;临时需要用到axis2 webservice。自己现学现总结的一些东西&#xff0c;留给新手。少走弯路。Axis2简介①采用…

网络系统服务器子系统,网管系统中服务器及网络设备监控子系统的设计与实现...

摘要&#xff1a;近年来,计算机网络的发展特点是规模不断扩大,复杂性不断增加,异构性越来越高,从而增加了网络管理的难度。面对越来越复杂和重要的网络,如何确保其尽可能长时间的正常运行,或当网络出现故障时,尽可能快地发现和修复故障,使其最大限度地发挥其应用功能和效益,就成…

普华永道:人工智能将重塑职位格局并与物联网合并

来源&#xff1a;亿欧概要&#xff1a;人工智能正在迅速普及&#xff0c;且其普及程度决定了其能为企业带来何种规模的效益。人工智能正在迅速普及&#xff0c;且其普及程度决定了其能为企业带来何种规模的效益。人工智能的核心在于以各种机器模拟智能行为&#xff0c;而物联网…

log4j 控制台和文件输出乱码问题解决

来源&#xff1a;http://www.coderli.com/log4j-console-file-garbled 一个小问题&#xff0c;却让我感觉到&#xff0c;现在真正动脑的人很少。。我来说说吧。今天遇到一个小问题&#xff0c;log4j输出到文件乱码&#xff0c;控制台正常。显然是编码问题导致。Google一搜&…

电脑没网络设备dns服务器没检测到响应,设备或资源dns没检测到有响应 网络无法连接...

以电脑为例&#xff0c;提示设备或资源dns没检测到有响应网络无法连接的原因是&#xff1a;1、可能是DNS解析不了&#xff0c;这时候可以看看自己的电脑的DNS是手动获取还是自动获取&#xff0c;如果是手动获取的话&#xff0c;改为自动获取。2、可能和网络设备或者网络环境有关…

asp.net ajax 怎么获取前端ul li_useEffect Hook 是如何工作的(前端需要懂的知识点)

作者&#xff1a;Dave Ceddia译者&#xff1a;前端小智来源&#xff1a;daveceddia.为了保证的可读性&#xff0c;本文采用意译而非直译。想象一下:你有一个非常好用的函数组件&#xff0c;然后有一天&#xff0c;咱们需要向它添加一个生命周期方法。呃…刚开始咱们可能会想怎么…

2018年全球5G的12大趋势

来源&#xff1a;5G概要&#xff1a;2018年全球5G的12大趋势行业观察未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&#xff0c;互联网和脑科学交叉研究机构。由互联网进化论作者&#xff0c;计算机博士刘锋与中国科学院虚拟经济与数据科学研究中心石勇、刘…