oracle高阶之 connect by
create table t2( root_id number, id number, name varchar(5), description varchar(10) );
insert into t2(root_id,id,name,description)values(0,1,'a','aaa'); insert into t2(root_id,id,name,description)values(1,2,'a1','aaa1'); insert into t2(root_id,id,name,description)values(1,3,'a2','aaa2'); insert into t2(root_id,id,name,description)values(0,4,'b','bbb'); insert into t2(root_id,id,name,description)values(4,5,'b1','bbb1'); insert into t2(root_id,id,name,description)values(4,6,'b2','bbb2')
select * from t2;
--prior在哪边,就表示哪列为父列 select * from t2 start with root_id = 0 connect by prior id = root_id; --level伪列表示树的深度(或叫高度)。 select t2.*,level from t2 connect by prior id = root_id; --首先,原表中id为1-6的6行数据均为第一层(id为父列),level=1 --其次,root_id的值等于id列的行为第二层,level=2 --所以查询结果共9行 select t2.*,level from t2 start with root_id = 0 connect by prior id = root_id; --start with子句限定了第一层数据,即,仅筛选root_id=0的记录 --<<当表中有重复行时,这些重复行不会合并在一起,而是单独算的 insert into t2(root_id,id,name,description)values(4,6,'b2','bbb2'); commit; select t2.*,level from t2 connect by prior id = root_id order by level,id; -->> --获取特定子树 select t2.*,level from t2 start with id = 4 connect by prior id = root_id; --prior被省略,则查询将不进行深层递归 select * from t2 start with root_id = 0 connect by id = root_id; select t2.*,level from t2 connect by level<3;