Oracle通過(guò)遞歸查詢父子兄弟節(jié)點(diǎn)方法示例
前言
說(shuō)到Oracle中的遞歸查詢語(yǔ)法,我覺得有一些數(shù)據(jù)庫(kù)基礎(chǔ)的童鞋應(yīng)該都知道,做項(xiàng)目的時(shí)候應(yīng)該也會(huì)用到,下面本文就來(lái)介紹下關(guān)于Oracle通過(guò)遞歸查詢父子兄弟節(jié)點(diǎn)的相關(guān)內(nèi)容,分享出來(lái)供大家參考學(xué)習(xí),下面話不多說(shuō)了,來(lái)一起看看詳細(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來(lái)標(biāo)識(shí)每個(gè)節(jié)點(diǎn)在表中的級(jí)別,還有就是使用with語(yǔ)法模擬出了一張帶有級(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í)別來(lái)判斷有幾種類型,以上文中舉的例子來(lái)說(shuō),有三種情況:
(1)當(dāng)前節(jié)點(diǎn)為頂級(jí)節(jié)點(diǎn),即查詢出來(lái)的lev值為1,那么它沒有上級(jí)節(jié)點(diǎn),不予考慮。
(2)當(dāng)前節(jié)點(diǎn)為2級(jí)節(jié)點(diǎn),查詢出來(lái)的lev值為2,那么就只要保證lev級(jí)別為1的就是其上級(jí)節(jié)點(diǎn)的兄弟節(jié)點(diǎn)。
(3)其它情況就是3以及以上級(jí)別,那么就要選查詢出來(lái)其上級(jí)的上級(jí)節(jié)點(diǎn)(祖父),再來(lái)判斷祖父的下級(jí)節(jié)點(diǎn)都是屬于該節(jié)點(diǎn)的上級(jí)節(jié)點(diǎn)的兄弟節(jié)點(diǎn)。
最后,就是使用union將查詢出來(lái)的結(jié)果進(jìn)行結(jié)合起來(lái),形成結(jié)果集。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Oracle收購(gòu)TimesTen 提高數(shù)據(jù)庫(kù)軟件性能
Oracle收購(gòu)TimesTen 提高數(shù)據(jù)庫(kù)軟件性能...2007-03-03
RAC cache fusion機(jī)制實(shí)現(xiàn)原理分析
本文將詳細(xì)介紹RAC cache fusion機(jī)制實(shí)現(xiàn)原理,需要了解更多的朋友可以參考下2012-12-12
oracle數(shù)據(jù)庫(kù)sql的優(yōu)化總結(jié)
自己對(duì)oracle sql的一些優(yōu)化總結(jié),特分享下,方便需要的朋友2013-08-08
Oracle CBO優(yōu)化模式中的5種索引訪問(wèn)方法淺析
這篇文章主要介紹了Oracle CBO優(yōu)化模式中的5種索引訪問(wèn)方法淺析,包含索引唯一掃描、索引范圍掃描、索引全掃描、索引跳躍掃描、索引快速全掃描等內(nèi)容,需要的朋友可以參考下2014-07-07
淺談Oracle 11g 發(fā)行版2 新安裝后關(guān)于登錄的一些基本操作
oracle 11g的兩個(gè)不同版本。11g剛發(fā)行時(shí),是11g第一版,簡(jiǎn)稱11.1,現(xiàn)在有個(gè)11g第二版,在功能上有了更多的改進(jìn),簡(jiǎn)稱11.2。本文給大家介紹Oracle 11g 發(fā)行版2 新安裝后關(guān)于登錄的一些基本操作,需要的朋友可以參考下2015-10-10
Oracle實(shí)現(xiàn)透明數(shù)據(jù)加密的代碼示例
透明數(shù)據(jù)加密(TDE)是一種用于保護(hù)數(shù)據(jù)庫(kù)中靜態(tài)數(shù)據(jù)的加密技術(shù),TDE通過(guò)自動(dòng)加密數(shù)據(jù)庫(kù)文件和日志文件,確保數(shù)據(jù)在磁盤上是加密的,從而防止未經(jīng)授權(quán)的訪問(wèn),以下以 Microsoft SQL Server 為例,實(shí)現(xiàn) TDE 的步驟和代碼示例,需要的朋友可以參考下2024-09-09
修改ORACLE數(shù)據(jù)庫(kù)密碼有效期的方法
這篇文章主要介紹了修改ORACLE數(shù)據(jù)庫(kù)密碼有效期的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09

