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中。
效果如下:
Oracle查询树结构表
层级不同,长度也不同
然后在用substr() 和 instr()来截取操作字符串。

实际操作,对于表:

Oracle查询树结构表

这是实际的表结构,有树状的层次关系

如果需要查“农用地”下的所有节点,可以用sql

select * from T_SJZD
start with bsm = ‘12953’
connect by SJZDBSM = prior bsm

结果如下
Oracle查询树结构表

最开头的节点就没了

网上找到更详细的查询方法,包括查亲兄弟、族兄弟、叔伯父等节点的方法:
http://blog.****.net/lisheng19870305/article/details/53669460