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.****.net/lisheng19870305/article/details/53669460