遞迴查詢與樹形結構

2022-07-28 00:51:11 字數 3426 閱讀 4803

關係數型據庫(如oracle)的資訊通常儲存在乙個或多個表中。

為表示現實世界中的有多重級聯關係的概念,通常我們會把這些物件儲存於同一張表,並通過一組字段(field)表達它們之間的隸屬關係。

譬如常見的部門資訊:

tb_dept(dept_id,dept_name,parent_id)

名稱含義

dept_id

部門id

dept_name

名稱parent_id

隸屬部門id

我們經常需要分析這些資料,並把結果組織成樹形結構加以表示。

針對這一問題,oracle提供了乙個查詢樹形資料的語法。

startwith...connectby

該子句是乙個遞迴查詢,它可以查詢樹中某個節點的所有子節點,並把結果按級展開乙個樹的形式,列出某節點所處的層,便於我們維護和處理。示例如下:

-

- 建立例項表

droptabletest_dept; 

createtabletest_dept

(dept_id varchar2(20),

dept_name varchar2(40),

parent_id varchar2(20));-

- 插入測試資料

從root往樹末梢遞迴

從末梢往樹root遞迴

connect by是結構化查詢中用到的,其基本語法是:

select...fromtablenamestartbycond1

connectbycond2

wherecond3;

簡單說來是將乙個樹狀結構儲存在一張表裡,比如乙個表中存在兩個字段:id, parentid那麼通過表示每一條記錄的parent是誰,就可以形成乙個樹狀結構。用上述語法的查詢可以取得這棵樹的所有記錄。

其中:cond1是根結點的限定語句,當然可以放寬限定條件,以取得多個根結點,實際就是多棵樹。

cond2是連線條件,其中用prior表示上一條記錄,比如 connect by prior id=praentid就是說上一條記錄的id是本條記錄的praentid,即本記錄的父親是上一條記錄。

cond3是過濾條件,用於對返回的所有記錄進行過濾。

prior和start with關鍵字是可選項

startwith...connectby

理解此語句的關鍵在與connect byprior

前者決定連線條件,後者決定遞迴執行的方向。

例子一:連線條件是dept_id = parent_id,方向是parent_id --> dept_id(往下)。

selectdept_id, 

dept_name,

level

fromtest_dept

startwithdept_id =

'0'connectbypriordept_id=parent_id;

例子二:連線條件是dept_id = parent_id,方向是dept_id --> parent_id(往上)。

selectdept_id, 

dept_name,

level

fromtest_dept

startwithdept_id =

'212'

connectbypriorparent_id = dept_id;

通過 wiz 發布

java 遞迴查詢樹形結構

什麼叫做遞迴呢?程式設計師呼叫自身的程式設計技巧叫做遞迴。例如區域的省市縣聯動,中,通過查詢省的id,查處這個省下邊的所有市以及市下邊的縣等操作,就可以通過遞迴演算法來查詢 我使用的框架是ssm,主要是在service層做判斷 private listgetregionlist string id ...

SQL 樹形結構遞迴查詢

with as短語,也叫做子查詢部分 subquery factoring 定義乙個sql 片段,改sql 片段會被整個sql語句用到。其中最實用的功能就是資料的遞迴,遞迴的原理 遞迴包括至少兩個查詢,乙個查詢作為遞迴的基點也就是起點,另乙個查詢作為遞迴的成員。with temp as select...

Oracle 遞迴查詢(樹形結構資料)

今天要做乙個查詢功能 查詢某使用者所屬部門,且包含該部門的所有上級部門資訊。偶然找到了乙個方法,特意來做個筆記。分享給和我一樣的菜鳥,哈哈 查詢子節點 1 select 2 fromd arc dep 3 start with depid 100000 4 connect by prior depi...