Oracle查詢樹結構表
11月最後一天,趕緊寫多一篇湊夠四篇
對於樹狀結構的表,即有記錄父節點或子節點的表,如果不知道到底有多少層級,Oracle有自帶的函式可以處理查詢
語法
select…start with… connect by …prior
select A from B where C = ‘D’
start with Id = ‘1’ connect by PreId = prior Id
prior代表的是父親的位置,如果是 connect by prior PreId = Id的話,證明PreId是父節點的屬性,反之,則代表Id是Prior的屬性
解析:
select語句查出來的結果再前,Id是標識碼,PreId是父節點的Id。
Start with 是開始的節點,此處起始節點Id為1
另外,由於查出來的都是單一層級的,不知道他的上一層級,或者是最高層級的結構。如果需要獲得每一層樹結構的某個屬性,可以用SYS_CONNECT_BT_PATH()函式獲取資訊
如:
SYS_CONNECT_BY_PATH (ZDDM, ‘/’) AS PATH,
這樣可以將每一個節點的ZDDM列,用’/’連線成字串,然後存在PATH中。
效果如下:
層級不同,長度也不同
然後在用substr() 和 instr()來擷取操作字串。
實際操作,對於表:
這是實際的表結構,有樹狀的層次關係
如果需要查“農用地”下的所有節點,可以用sql
select * from T_SJZD
start with bsm = ‘12953’
connect by SJZDBSM = prior bsm
結果如下
最開頭的節點就沒了
網上找到更詳細的查詢方法,包括查親兄弟、族兄弟、叔伯父等節點的方法:
http://blog.csdn.net/lisheng19870305/article/details/53669460