踏破铁鞋无觅处,得来全不费功夫-sys_connect_by_path函数

网友投稿 278 2022-08-24

踏破铁鞋无觅处,得来全不费功夫-sys_connect_by_path函数

这几天和几个网上朋友一起探讨oracle开发中的一些特别之处,谈到了竖横对换的方式。

以前看过有人转换过的,当时仅仅惊叹了一下,就过去了,没有记下来,直至于用到的时候呢,开始到处找,找来找去都没有找不到痕迹了,心里也就郁郁寡欢呀。

今天无意间,看connect by的使用,看到了sys_connect_by_path的用法,算是给我一个另类的惊喜了,sys_connect_by_path(columnname, seperator) 也可以拼出串来,不过这个函数本身不是用来给我们做这个结果集连接用的,而是用来构造树路径的,所以需要和connect by一起来用。

呵呵呵,在这里嚣张了一把,基于对oracle的一些函数的了解的基础上,看我是怎样硬生生的把一个没有树结构的普通表或者结果集做出我们想要的东西来。

magic is start.

道具,一个普通表,就一个字段 name, 姑且叫表名为test_sysconnectbypath吧,表名太长,嘻嘻,不怕,别名之。

以下为该表数据

NAME

------------------

深圳

武汉

上海

北京

天津

新加坡

别名之

SQL>with 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 from 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,仅是窃喜,

找寻工作还要继续,什么时候才很然给我拨开云雾找到你哟。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:北京女足战平山东保住第三,于允希望年轻球员多支援王珊珊!(山东女足对北京女足)
下一篇:营销除了是研究人的学问,也是一个做人的学问!(销售真的是一门学问)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~