層次查詢(hierarial retrival)
1.層次查詢基本概念
層次查詢是描敘乙個樹狀結構,我們可以通過層次查詢來控制自上而下,或者自下而上的查詢樹狀資料。並且還可以確定查詢起始點
start with確定開始點
connect by確定遍歷的方向。
2.層次查詢語法
select [level],column,expression....
from table/view
[where conditions]
[start with conditions]
[connect by prior conditions]
eg1:
select level,t.nodename,t.fathernodename from t_topo_bearer t
where t.expiretime = to_date('2099-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss')
start with t.nodename = 'root'
connect by prior t.nodename = t.fathernodename;
level是可選的,表示等級,如上圖,中心節點的level就是1,江蘇省,node1的級別是2
from後面可以**或者檢視,但是只能是乙個table,如果是檢視,那麼這個檢視不能含join
where條件是限制條件,但是不會影響層次關係,只是會截斷節點,但是截斷節點下的子節點不會受影響
start with 表示開始節點,後面接常規的過濾條件表示式,也可以是子查詢
connect by prior 表示指定父子關係,prior表示上一行記錄,後面也接常規的表示式,不可以接子查詢,而且限制條件會影響層次結構
3.使用level和lpad函式格式化報表
level是層次查詢中的乙個偽劣,使用level必須要有connect by ,可以不要start with
我們經常可以根據level來構造資料
應用1).如我們要構造乙個時間列表
select 2011 + level -1 from dual connect by level < 10 ;
2)格式化報表
與lpad函式連用格式化報表
lpad是在乙個字串的左邊填充字串,即字串滿足ipad函式中間引數的長度值
egselect level,lpad(t.nodename,(length(t.nodename)+ level * 2 -2),'-'),t.fathernodename from t_topo_bearer t
where t.expiretime = to_date('2099-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss')
start with t.nodename = 'root'
connect by prior t.nodename = t.fathernodename;
3)統計樹的層次,即樹的深度
select count(distinct level) from t_topo_bearer t
where t.expiretime = to_date('2099-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss')
start with t.nodename = 'root'
connect by prior t.nodename = t.fathernodename;
4)統計每個層次的節點數
select level,count(t.nodename) from t_topo_bearer t
where t.expiretime = to_date('2099-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss')
start with t.nodename = 'root'
connect by prior t.nodename = t.fathernodename
group by level
4.層次查詢中的排序(order)
因為order排序是在層次查詢完成後,然後進行排序,所以這樣排序是沒有太多的意義,因為破壞了層次的結構順序,為了避免排序時導致層次錯亂的問題,我們可以採用oracle提供的siblings關鍵字
eg:select level,lpad(ename,length(ename)+ level * 2-2,'-'),mgr from emp
start with mgr is null
connect by prior empno = mgr
order siblings by ename;
5.增強特性
1)connect_by_isleaf 是表示乙個節點,如果是葉子節點則是1,否則0
egselect level,lpad(ename,length(ename)+ level * 2-2,'-'),mgr from emp
where connect_by_isleaf
start with mgr is null
connect by prior empno = mgr;
2)sys_connect_by_path(column,char),column是字元型別或能自動轉換成字元型別的列,它的作用主要是將該列從父節點到當前節點節點通過char連線起來的路徑
eg:select sys_connect_by_path(ename,'=>')from emp
start with mgr is null
connect by prior empno = mgr;
3) connect_by_root用在列名之前表示此行的根節點的相同列名的值
eg:select sys_connect_by_path(ename,'=>'),ename,connect_by_root ename fathername from emp
start with mgr is null
connect by prior empno = mgr;
oracle 層次查詢
1 簡介 oracle層次化查詢是oracle特有的功能實現,主要用於返回乙個資料集,這個資料集存在樹的關係 資料集中存在乙個pid記錄著當前資料集某一條記錄的id 2 層次化查詢主要包含兩個子句,乙個start with另乙個是connect by。start with 這個子句一般用於指定層次化...
oracle的層次查詢
語法 select 列名次from 表名次 where 條件 start with 條件connect by prior 當前表這段 級聯表字段。解釋 where 條件為可選,start with 條件connect by prior 語句完成遞迴查詢,形成一棵樹形結構。start with 表示開...
理解oracle層次查詢
作為一名開發和管理兼修的工程師,有時候會遇到編寫複雜的sql 此時就會查詢資料,事後又很快會忘記。記得自己每次編寫層次結構的時候都會找資料,到底誰是父親,誰是孩子,prior放在那邊代表什麼意思。今天主要把層次的語法進行分析,並用自己的理解記住自頂向下和自底向上。基本語法很簡單 select fro...