您好,欢迎访问一九零五行业门户网

DB2通过SQL实现递归查询 (根据子机构查询机构所属树)

create table main_node ( mla_id integer not null, mla_rootid integer, mla_parentid integer, mla_name varchar(50), primary key (mla_id) ) //查询子机构所属 树结构; //where parent. mla_id= child.mla_parentid (父机构及其所有子机构) with rpl (m
create table  main_node (
mla_id               integer     not null,  
mla_rootid          integer,                    
mla_parentid        integer,                    
mla_name            varchar(50),    
primary key (mla_id)
)
//查询子机构所属 树结构; // where parent. mla_id= child.mla_parentid (父机构及其所有子机构)
with  rpl (mla_parentid, mla_id, mla_name) as
(
select root.mla_parentid, root.mla_id, root.mla_name from main_node root where root.mla_id = 3
union  all
select child.mla_parentid, child.mla_id, child.mla_name from rpl parent, main_node child where parent.mla_parentid = child.mla_id
 )
select distinct mla_parentid, mla_id, mla_name from rpl order by mla_parentid, mla_id, mla_name
让我们研究这个查询语句:
rpl 作为一个具有以下三列的虚拟表:mla_parentid, mla_id 和 mla_name。with 子句内的第一个 select 语句是初始化表。它只执行一次。它的结果形成虚拟表的初始内容以作为递归的种子。在上面的示例中,种子是 mla_id 为 任意传进去的参数 的一行或多行。第二个 select 语句执行多次。将种子作为输入(join 中的辅助表)传递给第二个 select 语句以产生下一个行集合。将 join 的结果添加(union all)到虚拟表的当前内容中,并放回到其中以形成用于下一次传递的输入。只要有行产生,这个过程就会继续。如果期望,虚拟表上最后的 select 允许我们选择递归查询所产生的所有行或仅部分行。
其它类似信息

推荐信息