select SYS_CONNECT_BY_PATH(列名,'') from 表名
專注于為中小企業(yè)提供網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)寒亭免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
start wITh 列名='0000000001'
connect by prior 列名(孩子列所有的列名)=列名(父列所有的列名)
這個(gè)查出來(lái)的樣式如下:
000000000001000000000000
不知道是不是你想要的。
可以設(shè)計(jì)成有層級(jí)的序列號(hào),最頂級(jí)找0101就可以了
no???id_sj????id_bj??????jc
000???????????01??????????1
001??01???????0101????????2
002??0101?????010101??????3
003??010101???01010101????4
如何結(jié)構(gòu)不能變,還是如下方式,而且當(dāng)前層級(jí)是幾級(jí)都不知道,就用循環(huán)吧
PS:001怎么還有上級(jí)編碼1?到底頂級(jí)在哪里?
no??id_sj?id_bj
001??1??????2
002??2??????3
003??3??????4
v_id_bj:=4;
while?v_id_sj?is?not?null?loop
select??id_sj?into?v_id_sj?from?tb?where?id_bj?=?v_id_bj;
select??id_bj?into?v_id_bj?from?tb?where?id_bj?=?v_id_sj;
end?loop;
1、創(chuàng)建測(cè)試表,create table test_connect(id number, p_id number);
2、插入測(cè)試數(shù)據(jù),
insert into test_connect values(1,1);
insert into test_connect values(2,1);
insert into test_connect values(3,2);
insert into test_connect values(4,3);
commit;
3、查詢數(shù)據(jù)表內(nèi)容,select * from?test_connect ,
4、執(zhí)行遞歸查詢語(yǔ)句,加入nocycle要素,不會(huì)出現(xiàn)【ORA-01436: 用戶數(shù)據(jù)中的 CONNECT BY 循環(huán)的錯(cuò)誤】,執(zhí)行結(jié)果如下,
select *
from test_connect t
start with id = 4
connect by nocycle prior t.p_id = t.id
我感覺(jué)你應(yīng)該分兩步走,第一找到父節(jié)點(diǎn),第二,將這些父節(jié)點(diǎn)加上條件。不知道你的父節(jié)點(diǎn)和葉子節(jié)點(diǎn)是怎么存儲(chǔ)到表中的,我舉一個(gè)父節(jié)點(diǎn)和葉子節(jié)點(diǎn)存儲(chǔ)在一個(gè)表中的情況給你說(shuō)一下。
第一步,找到所有父節(jié)點(diǎn) select 父節(jié)點(diǎn) from table_A where table_A.isdetail1(意思是說(shuō),父節(jié)點(diǎn)不是明細(xì)項(xiàng))
第二步,找到葉子節(jié)點(diǎn)的父節(jié)點(diǎn):select 父節(jié)點(diǎn) from table_A where table_A.isdetail1 and table_A.葉子節(jié)點(diǎn) in(葉子節(jié)點(diǎn))
第三步,再加上條件:找到葉子節(jié)點(diǎn)的父節(jié)點(diǎn):select 父節(jié)點(diǎn) from table_A where table_A.isdetail1 and table_A.葉子節(jié)點(diǎn) in(葉子節(jié)點(diǎn))and 父節(jié)點(diǎn)不符合哪些條件。
一般來(lái)說(shuō)這種遞歸查詢應(yīng)該用start with connect by,不過(guò)你的表中少了一列,就是當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)列,所以這個(gè)應(yīng)該不能用。
比如元數(shù)據(jù)為4列 其中兩列類似為
父節(jié)點(diǎn)編碼 當(dāng)前節(jié)點(diǎn)編碼
010001000000 010001010000
010001010000 010001010200
那么start with connect by就可以用了,這里因?yàn)闆](méi)有這個(gè)父節(jié)點(diǎn)編碼的字段,所以不能用。
那么查詢就麻煩一些,我想到了一個(gè)辦法,不過(guò)是這個(gè)表結(jié)構(gòu)的特例,希望能幫到你
第一步是截取輸入的diccode的非零長(zhǎng)度,我想到的辦法是length(trim(tailing 0 from '輸入或計(jì)算得到的diccode值'))--假設(shè)得到的是8位,假設(shè)為01000101 8位
那么所有的子節(jié)點(diǎn)就是 diccode like substr(diccode,1,length(trim(tailing 0 from '輸入或計(jì)算得到的diccode值')))%
意思就是 diccode like '01000101%'(這不就是所有該節(jié)點(diǎn)的子節(jié)點(diǎn)了么,包括自身)
(以上部分的寫法要斟酌一下,%是通配符,一般來(lái)說(shuō)我們的寫法是like ‘a(chǎn)%’,但是單引號(hào)部分怎么寫,需不需要轉(zhuǎn)譯,反引號(hào)行不行,與%怎么連接,我沒(méi)有環(huán)境只能寫個(gè)大概意思,具體的要試驗(yàn)才行。)
然后求父節(jié)點(diǎn),先求上一級(jí),diccode=(case when length(trim(tailing 0 from '輸入或計(jì)算得到的diccode值'))-20 then rpad(substr('輸入或計(jì)算得到的diccode值',1, length(trim(tailing 0 from '輸入或計(jì)算得到的diccode值'))-2),12,0) else 0 end)
意思就是:截取到01000101后,長(zhǎng)度為8位,長(zhǎng)度-2為6位那么就是010001,然后補(bǔ)足12位的0,為010001000000,也就是上一級(jí)父節(jié)點(diǎn)。如果輸入為010000000000,那么第一步就直接查出所有內(nèi)容了,后面這個(gè)條件用or連接,查出來(lái)的都是0,也就是diccode=0,不會(huì)干擾正常內(nèi)容的顯示。
然后繼續(xù)-2變成-4(這樣舉例就變成為010000000000),再變成-6(例子中雖然也能查出來(lái)010000000000,但是前面已經(jīng)查出,不會(huì)重復(fù)顯示的),-8(例子中等于0,那么顯示diccode=0,因?yàn)閛r連接所以不耽誤顯示),-10,我看了你的編碼是12位,-10應(yīng)該夠了,寫法同上,然后所有的條件用or連接,這樣不用寫過(guò)程去計(jì)算,雖然麻煩,而且速度不會(huì)太快,但是思路應(yīng)該沒(méi)錯(cuò)。
其實(shí)我一直在琢磨應(yīng)該可以用start with connect by寫后面的-2到-10部分,但是如果寫成start那么這部分需要測(cè)試,我這里沒(méi)有相關(guān)的環(huán)境,所以只能是這么寫,麻煩一些。而且starwith好像沒(méi)辦法就相關(guān)子節(jié)點(diǎn),所以我也不知道到底能不能用。
假設(shè)這個(gè)表名為A
select * from A START WITH id in
(select distinct id from A )
CONNECT BY PRIOR oid=id
oracle 10g之前執(zhí)行這條語(yǔ)句,好像oid不能為空,你可以將id為1那條數(shù)據(jù)oid欄位設(shè)置為1或者別的,反正不要是里面有的節(jié)點(diǎn)的id就行了
本文名稱:oracle如何找父節(jié)點(diǎn),查找父節(jié)點(diǎn)
文章位置:http://jinyejixie.com/article0/dssseoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、動(dòng)態(tài)網(wǎng)站、網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站、建站公司、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)