溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Oracle通過遞歸查詢父子兄弟節(jié)點(diǎn)方法示例

發(fā)布時(shí)間:2020-10-25 12:55:35 來源:腳本之家 閱讀:221 作者:dahaihh 欄目:數(shù)據(jù)庫

前言

說到Oracle中的遞歸查詢語法,我覺得有一些數(shù)據(jù)庫基礎(chǔ)的童鞋應(yīng)該都知道,做項(xiàng)目的時(shí)候應(yīng)該也會(huì)用到,下面本文就來介紹下關(guān)于Oracle通過遞歸查詢父子兄弟節(jié)點(diǎn)的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),下面話不多說了,來一起看看詳細(xì)的介紹吧。

方法如下:

1、查詢某節(jié)點(diǎn)下所有后代節(jié)點(diǎn)(包括各級(jí)父節(jié)點(diǎn))

 // 查詢id為101的所有后代節(jié)點(diǎn),包含101在內(nèi)的各級(jí)父節(jié)點(diǎn)
 select t.* from SYS_ORG t start with id = '101' connect by parent_id = prior id

2、查詢某節(jié)點(diǎn)下所有后代節(jié)點(diǎn)(不包含各級(jí)父節(jié)點(diǎn))

select t.*
 from SYS_ORG t
 where not exists (select 1 from SYS_ORG s where s.parent_id = t.id)
 start with id = '101'
connect by parent_id = prior id

3、查詢某節(jié)點(diǎn)所有父節(jié)點(diǎn)(所有祖宗節(jié)點(diǎn))

 select t.*
 from SYS_ORG t
 start with id = '401000501'
 connect by prior parent_id = id

4、查詢某節(jié)點(diǎn)所有的兄弟節(jié)點(diǎn)(親兄弟)

 select * from SYS_ORG t
 where exists (select * from SYS_ORG s where t.parent_id=s.parent_id and s.id='401000501')

5、查詢某節(jié)點(diǎn)所有同級(jí)節(jié)點(diǎn)(族節(jié)點(diǎn)),假設(shè)不設(shè)置級(jí)別字段

with tmp as(
  select t.*, level leaf  
  from SYS_ORG t    
  start with t.parent_id = '0'  
  connect by t.parent_id = prior t.id)
select *        
  from tmp        
where leaf = (select leaf from tmp where id = '401000501');

這里使用兩個(gè)技巧,一個(gè)是使用了level來標(biāo)識(shí)每個(gè)節(jié)點(diǎn)在表中的級(jí)別,還有就是使用with語法模擬出了一張帶有級(jí)別的臨時(shí)表

 6、查詢某節(jié)點(diǎn)的父節(jié)點(diǎn)及兄弟節(jié)點(diǎn)(叔伯節(jié)點(diǎn))

with tmp as(
 select t.*, level lev
 from SYS_ORG t
 start with t.parent_id = '0'
 connect by t.parent_id = prior t.id) 
select b.*
from tmp b,(select *
   from tmp
   where id = '401000501' and lev = '2') a
where b.lev = '1'
union all
select *
from tmp
where parent_id = (select distinct x.id
    from tmp x, --祖父
      tmp y, --父親
      (select *
      from tmp
      where id = '401000501' and lev > '2') z --兒子
    where y.id = z.parent_id and x.id = y.parent_id);

這里查詢分成以下幾步。

首先,將全表都使用臨時(shí)表加上級(jí)別;

其次,根據(jù)級(jí)別來判斷有幾種類型,以上文中舉的例子來說,有三種情況:

(1)當(dāng)前節(jié)點(diǎn)為頂級(jí)節(jié)點(diǎn),即查詢出來的lev值為1,那么它沒有上級(jí)節(jié)點(diǎn),不予考慮。

(2)當(dāng)前節(jié)點(diǎn)為2級(jí)節(jié)點(diǎn),查詢出來的lev值為2,那么就只要保證lev級(jí)別為1的就是其上級(jí)節(jié)點(diǎn)的兄弟節(jié)點(diǎn)。

(3)其它情況就是3以及以上級(jí)別,那么就要選查詢出來其上級(jí)的上級(jí)節(jié)點(diǎn)(祖父),再來判斷祖父的下級(jí)節(jié)點(diǎn)都是屬于該節(jié)點(diǎn)的上級(jí)節(jié)點(diǎn)的兄弟節(jié)點(diǎn)。

最后,就是使用union將查詢出來的結(jié)果進(jìn)行結(jié)合起來,形成結(jié)果集。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI