首页 > 代码库 > sql server利用cte递归查询

sql server利用cte递归查询

  • 1.数据环境准备

           参考Oracle递归查询文章。

  • 2.查询某个节点下的所有子节点
 with cte(id,name,parent_id) as  (    select id,name,parent_id from SC_DISTRICT where name=巴中市   union all     select sd.id,sd.name,sd.parent_id  from SC_DISTRICT sd ,cte c where c.id = sd.parent_id  )select * from cteresult:id               name           parent_id2    巴中市    14    巴州区    25    通江县    26    平昌县    213    大寨乡    614    响滩镇    615    龙岗镇    616    白衣镇    6
  •  3.计算层级(类似Oracle的level伪列)
with cte(id,name,parent_id,lev) as(   select id,name,parent_id,1 from SC_DISTRICT where name=达州市   union all   select sd.id,sd.name,sd.parent_id,c.lev+1 from SC_DISTRICT sd,cte c where c.id=sd.parent_id)select * from cteresult:id               name           parent_id     lev3    达州市    1    17    通川区    3    28    宣汉县    3    29    塔河乡    8    310    三河乡    8    311    胡家镇    8    312    南坝镇    8    3
  •  4.查询路径的根节点(类似Oracle的connect_by_root)
with cte(id,name,parent_id,rootid,rootname) as(   select id,name,parent_id,id rootid,name rootname from SC_DISTRICT where name=达州市   union all   select sd.id,sd.name,sd.parent_id,cte.rootid,cte.rootname from SC_DISTRICT sd,cte where sd.parent_id=cte.id)select * from cteresult:id                name          parent_id    rootid          rootname3    达州市    1    3    达州市7    通川区    3    3    达州市8    宣汉县    3    3    达州市9    塔河乡    8    3    达州市10    三河乡    8    3    达州市11    胡家镇    8    3    达州市12    南坝镇    8    3    达州市
  •  5.查询递归路径(类似Oracle的sys_connect_by_path)
with cte(id,name,pathname) as(   select id,name,cast(name as nvarchar)  from SC_DISTRICT where name=达州市   union all   select sd.id,sd.name,cast(cte.pathname+_+sd.name as nvarchar)  from SC_DISTRICT sd,cte where sd.parent_id=cte.id)select * from ctewith cte(id,name,pathname) as(   select id,name,convert(nvarchar,name)  from SC_DISTRICT where name=达州市   union all   select sd.id,sd.name,convert(nvarchar,cte.pathname+_+sd.name)  from SC_DISTRICT sd,cte where sd.parent_id=cte.id)select * from cteresult:id                name          pathname3    达州市    达州市7    通川区    达州市_通川区8    宣汉县    达州市_宣汉县9    塔河乡    达州市_宣汉县_塔河乡10    三河乡    达州市_宣汉县_三河乡11    胡家镇    达州市_宣汉县_胡家镇12    南坝镇    达州市_宣汉县_南坝镇

 

sql server利用cte递归查询