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 允许我们选择递归查询所产生的所有行或仅部分行。
