I code it

Code and Life

Oracle查询树形关系

在日常开发中,经常会处理树形的关系,比如目录树,层次关系等。在关系数据库中,可以为每条记录添加(id, parent_id)这样的对来实现,parent_id标记为空的节点为根。比如,一个最简单的树形表的定义如下:

   1: create table tree(
   2:     item_id varchar2(32),
   3:     item_pid varchar2(32),
   4:     item_desc varchar2(256)
   5: );

 

我们定义一棵简单的树,包含7个节点:

image

对于前端展现来讲,最好可以知道每个层次下多少个节点,逐级展开,这样当树很大的时候也不会有效率上的影响。可以使用oracle提供的方式来做到这一点:

   1: select item_id, item_desc, level
   2:   from tree t
   3:  start with item_id = 'A'
   4: connect by prior item_id = item_pid
   5:  order by level;

 

查询以节点A(根节点)开始的所有节点,并获得其层次:

tree_level

另外,很多时候我们需要获得树上节点的路径,如F节点的路径应为/A/B/F。这个可以通过oracle提供的sys_connect_by_path来实现:

   1: select item_id, item_desc, level, sys_connect_by_path(item_id, '/') as path
   2:   from tree t
   3:  start with item_id = 'A'
   4: connect by prior item_id = item_pid
   5:  order by level;

这样除了层次之外,还可以获得节点的tree-path:

tree_level_path

Comments