oracle sys_connect_by_path 函數(shù) 結(jié)果集連接
更新時(shí)間:2009年07月09日 13:51:43 作者:
這幾天和幾個(gè)網(wǎng)上朋友一起探討oracle開發(fā)中的一些特別之處,談到了豎橫對換的方式。
以前看過有人轉(zhuǎn)換過的,當(dāng)時(shí)僅僅驚嘆了一下,就過去了,沒有記下來,直至于用到的時(shí)候呢,開始到處找,找來找去都沒有找不到痕跡了,心里也就郁郁寡歡呀。
今天無意間,看connect by的使用,看到了sys_connect_by_path的用法,算是給我一個(gè)另類的驚喜了,sys_connect_by_path(columnname, seperator) 也可以拼出串來,不過這個(gè)函數(shù)本身不是用來給我們做這個(gè)結(jié)果集連接用的,而是用來構(gòu)造樹路徑的,所以需要和connect by一起來用。
呵呵呵,在這里囂張了一把,基于對oracle的一些函數(shù)的了解的基礎(chǔ)上,看我是怎樣硬生生的把一個(gè)沒有樹結(jié)構(gòu)的普通表或者結(jié)果集做出我們想要的東西來。
magic is start.
道具,一個(gè)普通表,就一個(gè)字段 name, 姑且叫表名為test_sysconnectbypath吧,表名太長,嘻嘻,不怕,別名之。
以下為該表數(shù)據(jù)
NAME
------------------
深圳
武漢
上海
北京
天津
新加坡
別名之
SQL>with temp as (select name form test_sysconnectbypath);
這是別名的寫法,我們下面的sql語句就可以用temp來代替這個(gè)結(jié)果集。當(dāng)然這個(gè)()里面可以是你自己的復(fù)雜查詢出來的結(jié)果集也行
第一變性開始,把這個(gè)變成有樹形結(jié)構(gòu)的
怎么才能變形成樹結(jié)構(gòu)了,大家馬上想到,加一個(gè)pid,和id才行喲,這里沒有,我們就給他們加上吧。不過,加了id,怎么來填他們的結(jié)構(gòu)數(shù)據(jù)呢,這里需要另一個(gè)函數(shù)顯圣了 lag() , lag() 是取前記錄, 和lead相對, 如果是簡單的拼的話,樹結(jié)構(gòu)不就是,上一條記錄就是下一條記錄的父節(jié)點(diǎn)了么
這樣我們用rownum,不就.... OK了
action
select t.name, no, lag(no) over(order by no) pid from (select temp.*, rownum no from temp) t;
結(jié)果出來了
NAME NO PID
-------------------- ---------- ----------
深圳 1
武漢 2 1
上海 3 2
北京 4 3
天津 5 4
新加坡 6 5
現(xiàn)在就是個(gè)樹形了吧。
再變樹
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;
看看結(jié)果吧
結(jié)果出來了
NAME NO PID
-------------------- ---------- ----------
深圳 1
武漢 2 1
上海 3 2
北京 4 3
天津 5 4
新加坡 6 5
奇怪結(jié)果沒有變喲,是的,這里只是把樹給選出來了,你如果加個(gè)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;
你們自己看結(jié)果吧。
Text
--------------------------------------------------
深圳,武漢,上海,北京,天津,新加坡
......
呵呵呵,雖然是做出來來,但是就像上面說講的,這里只是另類的喜悅,因?yàn)檫@個(gè)不是我以前看到的那個(gè)解決方案,不過是通過這個(gè)方法,有用到了強(qiáng)大的connect by已經(jīng)分析函數(shù)over,僅是竊喜,
找尋工作還要繼續(xù),什么時(shí)候才很然給我撥開云霧找到你喲。
今天無意間,看connect by的使用,看到了sys_connect_by_path的用法,算是給我一個(gè)另類的驚喜了,sys_connect_by_path(columnname, seperator) 也可以拼出串來,不過這個(gè)函數(shù)本身不是用來給我們做這個(gè)結(jié)果集連接用的,而是用來構(gòu)造樹路徑的,所以需要和connect by一起來用。
呵呵呵,在這里囂張了一把,基于對oracle的一些函數(shù)的了解的基礎(chǔ)上,看我是怎樣硬生生的把一個(gè)沒有樹結(jié)構(gòu)的普通表或者結(jié)果集做出我們想要的東西來。
magic is start.
道具,一個(gè)普通表,就一個(gè)字段 name, 姑且叫表名為test_sysconnectbypath吧,表名太長,嘻嘻,不怕,別名之。
以下為該表數(shù)據(jù)
NAME
------------------
深圳
武漢
上海
北京
天津
新加坡
別名之
SQL>with temp as (select name form test_sysconnectbypath);
這是別名的寫法,我們下面的sql語句就可以用temp來代替這個(gè)結(jié)果集。當(dāng)然這個(gè)()里面可以是你自己的復(fù)雜查詢出來的結(jié)果集也行
第一變性開始,把這個(gè)變成有樹形結(jié)構(gòu)的
怎么才能變形成樹結(jié)構(gòu)了,大家馬上想到,加一個(gè)pid,和id才行喲,這里沒有,我們就給他們加上吧。不過,加了id,怎么來填他們的結(jié)構(gòu)數(shù)據(jù)呢,這里需要另一個(gè)函數(shù)顯圣了 lag() , lag() 是取前記錄, 和lead相對, 如果是簡單的拼的話,樹結(jié)構(gòu)不就是,上一條記錄就是下一條記錄的父節(jié)點(diǎn)了么
這樣我們用rownum,不就.... OK了
action
select t.name, no, lag(no) over(order by no) pid from (select temp.*, rownum no from temp) t;
結(jié)果出來了
NAME NO PID
-------------------- ---------- ----------
深圳 1
武漢 2 1
上海 3 2
北京 4 3
天津 5 4
新加坡 6 5
現(xiàn)在就是個(gè)樹形了吧。
再變樹
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;
看看結(jié)果吧
結(jié)果出來了
NAME NO PID
-------------------- ---------- ----------
深圳 1
武漢 2 1
上海 3 2
北京 4 3
天津 5 4
新加坡 6 5
奇怪結(jié)果沒有變喲,是的,這里只是把樹給選出來了,你如果加個(gè)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;
你們自己看結(jié)果吧。
Text
--------------------------------------------------
深圳,武漢,上海,北京,天津,新加坡
......
呵呵呵,雖然是做出來來,但是就像上面說講的,這里只是另類的喜悅,因?yàn)檫@個(gè)不是我以前看到的那個(gè)解決方案,不過是通過這個(gè)方法,有用到了強(qiáng)大的connect by已經(jīng)分析函數(shù)over,僅是竊喜,
找尋工作還要繼續(xù),什么時(shí)候才很然給我撥開云霧找到你喲。
相關(guān)文章
Oracle靜態(tài)注冊與動(dòng)態(tài)注冊詳解
這篇文章主要介紹了Oracle靜態(tài)注冊與動(dòng)態(tài)注冊,需要的朋友可以參考下2014-07-07Oracle 批處理自動(dòng)備份bat腳本語句的步驟詳解
這篇文章主要介紹了Oracle 批處理自動(dòng)備份bat腳本語句的步驟詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01詳解PL/SQL Developer連接本地Oracle 11g 64位數(shù)據(jù)庫
本篇文章主要介紹了PL/SQL Developer連接本地Oracle 11g 64位數(shù)據(jù)庫 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04Oracle中的Connect/session和process的區(qū)別及關(guān)系介紹
本文將詳細(xì)探討下Oracle中的Connect/session和process的區(qū)別及關(guān)系,感興趣的你可以參考下,希望可以幫助到你2013-03-03巧妙解決Oracle NClob讀寫問題(經(jīng)驗(yàn)分享)
下面小編就為大家?guī)硪黄擅罱鉀QOracle NClob讀寫問題(經(jīng)驗(yàn)分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10