/*通用表表达式 CTE的递归*/ --1.CTE有一个优点就是可以允许自身引用,这样可以方便创建递归的CTE --递归CTE的结构包括:定位点成员和递归成员,递归的过程就是Ti作为输入,Ti+1作为输出。 --创建测试数据 create table test( id varchar(30), parentID varchar(30), name varchar(30) ) insert into test values('001','','1'); insert into test values('001001','001','11'); insert into test values('001002','001','12'); insert into test values('001001001','001001','111'); insert into test values('001001002','001002','112'); insert into test values('001001001001','001001001','1111'); --查询11的下级 with c11 as ( select * from test where id='001001'--定位点成员,作为Ti输入,查询它的下级就是 c11.id=test.ParentID union all--必须以union all 来连接递归成员 select b.* from c11 a join test b on a.id=b.ParentID--必须是b.*,a.*报错了,无限循环了 ) select * from c11 order by id; --结果: 001001 001 11 001001001 001001 111 001001001001 001001001 1111 --查询1111的上级 with c1111 as ( select * from test where id='001001001001'--定位点成员,座位图T0输入,查询它的上级就是 c1111.ParentID=test.ID union all select b.* from c1111 a join test b on a.parentid=b.id ) select * from c1111 order by id; --结果集: 001 1 001001 001 11 001001001 001001 111 001001001001 001001001 1111