脚本宝典收集整理的这篇文章主要介绍了oracle sys_connect_by_path 函数 结果集连接,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
以前看过有人转换过的,
当时仅仅惊叹了一下,就过去了,没有记下来,直至于用到的时候呢,
开始到处找,找来找去都没有找不到痕迹了,心里也就郁郁寡欢呀。
今天无意间,看connect by的使用,看到了
Sys_connect_by_path的用法,算是给我一个另类的惊喜了,sys_connect_by_path(columnn
ame, se
PErator) 也可以拼出串来,
不过这个函数本身不是用来给我们做这个结果集连接用的,而是用来构造树路径的,所以需要和connect by一起来用。
呵呵呵,在这里嚣张了一把,基于对
oracle的一些函数的
了解的基础上,看我是
怎样硬生生的把一个没有
树结构的普通表
或者结果集
做出我们想要的东西来。
magic is start.
道具,一个普通表,就一个字段 name, 姑且叫表名为
test_sysconnectbypath吧,表名太长,嘻嘻,不怕,别名之。
以下为该表数据
NAME
------------------
深圳
武汉
上海
北京
天津
新加坡
别名之
SQL>w
ITh temp as (select name form test_sysconnectbypath);
这是别名的写法,我们下面的sql语句就可以用temp来代替这个结果集。当然这个()里面可以是你自己的复杂查询出来的结果集也行
第一变性开始,把这个变成有树形结构的
怎么才能
变形成树结构了,大家马上想到,加一个pid,和id才行哟,这里没有,我们就给他们加上吧。不过,加了id,怎么来填他们的结构数据呢,这里需要另一个函数显圣了 lag() , lag() 是取前记录, 和lead相对, 如果是
简单的拼的话,树结构不就是,上一条记录就是下一条记录的父节点了么
这样我们用rownum,不就
.... OK了
action
select t.name, no, lag(no) over(order by no) pid
From (select temp.*, rownum no f
rom temp) t;
结果出来了
NAME NO PID
-------------------- ---------- ----------
深圳 1
武汉 2 1
上海 3 2
北京 4 3
天津 5 4
新加坡 6 5
现在就是个树形了吧。
再变树
action
select * from (select t.name, no, lag(no) over(order by no) pid from (select temp.*, rownum no from temp)) t start with pid is null connect by
PRior no=pid;
看看结果吧
结果出来了
NAME NO PID
-------------------- ---------- ----------
深圳 1
武汉 2 1
上海 3 2
北京 4 3
天津 5 4
新加坡 6 5
奇怪结果没有变哟,是的,这里只是把树给选出来了,你如果加个lpad(' ', 4*level, '*')||name就可以看出端倪了
最后一变,拼成串
select sys_connect_by_path(name. ',') text from (select t.name, no, lag(no) over(order by no) pid from (select temp.*, rownum no from temp)) t start with pid is null connect by prior no=pid;
你们自己看结果吧。
Text
--------------------------------------------------
深圳,武汉,上海,北京,天津,新加坡
......
呵呵呵,虽然是做出来来,但是就像上面说讲的,这里只是另类的喜悦,因为这个不是我以前看到的那个解决
方案,不过是通过这个方法,有用到了强大的connect by已经分析函数over,仅是窃喜,
找寻工作还要继续,什么时候才很然给我拨开
云雾找到你哟。
脚本宝典总结
以上是脚本宝典为你收集整理的oracle sys_connect_by_path 函数 结果集连接全部内容,希望文章能够帮你解决oracle sys_connect_by_path 函数 结果集连接所遇到的问题。
如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。