Oracle通過遞歸查詢父子兄弟節(jié)點方法示例
前言
說到Oracle中的遞歸查詢語法,我覺得有一些數(shù)據(jù)庫基礎(chǔ)的童鞋應(yīng)該都知道,做項目的時候應(yīng)該也會用到,下面本文就來介紹下關(guān)于Oracle通過遞歸查詢父子兄弟節(jié)點的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),下面話不多說了,來一起看看詳細(xì)的介紹吧。
方法如下:
1、查詢某節(jié)點下所有后代節(jié)點(包括各級父節(jié)點)
// 查詢id為101的所有后代節(jié)點,包含101在內(nèi)的各級父節(jié)點 select t.* from SYS_ORG t start with id = '101' connect by parent_id = prior id
2、查詢某節(jié)點下所有后代節(jié)點(不包含各級父節(jié)點)
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é)點所有父節(jié)點(所有祖宗節(jié)點)
select t.* from SYS_ORG t start with id = '401000501' connect by prior parent_id = id
4、查詢某節(jié)點所有的兄弟節(jié)點(親兄弟)
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é)點所有同級節(jié)點(族節(jié)點),假設(shè)不設(shè)置級別字段
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');
這里使用兩個技巧,一個是使用了level來標(biāo)識每個節(jié)點在表中的級別,還有就是使用with語法模擬出了一張帶有級別的臨時表
6、查詢某節(jié)點的父節(jié)點及兄弟節(jié)點(叔伯節(jié)點)
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);
這里查詢分成以下幾步。
首先,將全表都使用臨時表加上級別;
其次,根據(jù)級別來判斷有幾種類型,以上文中舉的例子來說,有三種情況:
(1)當(dāng)前節(jié)點為頂級節(jié)點,即查詢出來的lev值為1,那么它沒有上級節(jié)點,不予考慮。
(2)當(dāng)前節(jié)點為2級節(jié)點,查詢出來的lev值為2,那么就只要保證lev級別為1的就是其上級節(jié)點的兄弟節(jié)點。
(3)其它情況就是3以及以上級別,那么就要選查詢出來其上級的上級節(jié)點(祖父),再來判斷祖父的下級節(jié)點都是屬于該節(jié)點的上級節(jié)點的兄弟節(jié)點。
最后,就是使用union將查詢出來的結(jié)果進行結(jié)合起來,形成結(jié)果集。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Windows Server 2012 安裝oracle11g(圖文教程)
這篇文章主要介紹了Windows Server 2012 安裝oracle11g(圖文教程),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
Linux中Oracle啟動偵聽報錯TNS:permission denied的解決方法
這篇文章主要介紹了Linux中Oracle啟動偵聽時報錯TNS:permission denied的解決方法,文中給出了詳細(xì)的解決方法,相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-02-02
Oracle/SQL中TO_DATE函數(shù)詳細(xì)實例解析
Oracle to_date()函數(shù)用于日期轉(zhuǎn)換,下面這篇文章主要給大家介紹了關(guān)于Oracle/SQL中TO_DATE函數(shù)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用oracle具有一定的參考解決價值,需要的朋友可以參考下2024-06-06
oracle關(guān)聯(lián)查詢報invalid number錯誤的解決方法
這篇文章主要介紹了oracle關(guān)聯(lián)查詢報invalid number錯誤的解決方法,文中通過代碼示例和圖文結(jié)合的方式講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-09-09
sqlplus 命令登錄 Oracle數(shù)據(jù)庫的多種方法
這篇文章主要介紹了sqlplus 命令登錄 Oracle數(shù)據(jù)庫的兩種方法,方式一通過sql*plus 命令窗口,方式2:通過 cmd 窗口,每種方式給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09

