關係數型據庫(如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 by和prior。
前者決定連線條件,後者決定遞迴執行的方向。
例子一:連線條件是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...