首页 > 代码库 > 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递归查询
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。