今天在开发的过程中,碰到了一个树形结构的表,需要通过节点编号查询所有子孙节点信息,在Oracle数据库上以前做过相关开发,目前使用的是DB2数据库,经过一番研究,总结如下:


--创建表
create table tb_area_info
(
   area_id        varchar(50) not null,
   area_name      varchar(90) not null,
   area_desc      varchar(90),
   parent_area_id varchar(50) not null,
   state          char(1) not null
);
--增加约束
alter table tb_area_info add constraint "PK_TB_AREA_INFO" primary key ("area_id");
--查询语句
with ids (area_id,area_name,parent_area_id) as
(select aa.area_id,aa.area_name,aa.parent_area_id from tb_area_info aa where aa.area_id='666'
 union all
 select bb.area_id,bb.area_name,bb.parent_area_id from tb_area_info bb,ids super
 where bb.parent_area_id=super.area_id)
 select * from ids;



     ids作为一个具有以下3列的虚表(area_id,area_name,parent_area_id),with子句内的第一个select语句是初始化表,它只执行一次。它的结果形成虚拟表的初始内容以作为递归的种子,在上面的例子中,种子是aa.area_id='666'的一行或者多行。第二个select语句要执行一次或者多次。种子将作为输入传递给第二个select语句产生下一个集合,将关联的结果添加(union all)到虚拟表的当前内容中形成用于下一次递归的输入。递归停止的前提条件是没有下级数据产生为止。