sqlserver实现树形结构递归查询(无限极分类)
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,SQL Server 2005开始,我们可以直接通过CTE来支持递归查询,CTE即公用表表达式百度百科公用表表达式(CTE),是一个在查询中定义的临时命名结果集将在from子句中使用它。每个CTE仅被
千家信息网最后更新 2026年11月03日sqlserver实现树形结构递归查询(无限极分类)
SQL Server 2005开始,我们可以直接通过CTE来支持递归查询,CTE即公用表表达式
百度百科
公用表表达式(CTE),是一个在查询中定义的临时命名结果集将在from子句中使用它。每个CTE仅被定义一次(但在其作用域内可以被引用任意次),并且在该查询生存期间将一直生存。可以使用CTE来执行递归操作。创建的语法是:
with
as(
)
select * from
生成数据
--菜单目录结构表create table tb_menu( id int not null, --主键idtitle varchar(50), --标题 parent int --parent id);--父菜单insert into tb_menu(id, title, parent) values(1, '父菜单1',null);insert into tb_menu(id, title, parent) values(2, '父菜单2',null);insert into tb_menu(id, title, parent) values(3, '父菜单3',null);insert into tb_menu(id, title, parent) values(4, '父菜单4',null);insert into tb_menu(id, title, parent) values(5, '父菜单5',null);--一级菜单insert into tb_menu(id, title, parent) values(6, '一级菜单6',1);insert into tb_menu(id, title, parent) values(7, '一级菜单7',1);insert into tb_menu(id, title, parent) values(8, '一级菜单8',1);insert into tb_menu(id, title, parent) values(9, '一级菜单9',2);insert into tb_menu(id, title, parent) values(10, '一级菜单10',2);insert into tb_menu(id, title, parent) values(11, '一级菜单11',2);insert into tb_menu(id, title, parent) values(12, '一级菜单12',3);insert into tb_menu(id, title, parent) values(13, '一级菜单13',3);insert into tb_menu(id, title, parent) values(14, '一级菜单14',3);insert into tb_menu(id, title, parent) values(15, '一级菜单15',4);insert into tb_menu(id, title, parent) values(16, '一级菜单16',4);insert into tb_menu(id, title, parent) values(17, '一级菜单17',4);insert into tb_menu(id, title, parent) values(18, '一级菜单18',5);insert into tb_menu(id, title, parent) values(19, '一级菜单19',5);insert into tb_menu(id, title, parent) values(20, '一级菜单20',5);--二级菜单insert into tb_menu(id, title, parent) values(21, '二级菜单21',6);insert into tb_menu(id, title, parent) values(22, '二级菜单22',6);insert into tb_menu(id, title, parent) values(23, '二级菜单23',7);insert into tb_menu(id, title, parent) values(24, '二级菜单24',7);insert into tb_menu(id, title, parent) values(25, '二级菜单25',8);insert into tb_menu(id, title, parent) values(26, '二级菜单26',9);insert into tb_menu(id, title, parent) values(27, '二级菜单27',10);insert into tb_menu(id, title, parent) values(28, '二级菜单28',11);insert into tb_menu(id, title, parent) values(29, '二级菜单29',12);insert into tb_menu(id, title, parent) values(30, '二级菜单30',13);insert into tb_menu(id, title, parent) values(31, '二级菜单31',14);insert into tb_menu(id, title, parent) values(32, '二级菜单32',15);insert into tb_menu(id, title, parent) values(33, '二级菜单33',16);insert into tb_menu(id, title, parent) values(34, '二级菜单34',17);insert into tb_menu(id, title, parent) values(35, '二级菜单35',18);insert into tb_menu(id, title, parent) values(36, '二级菜单36',19);insert into tb_menu(id, title, parent) values(37, '二级菜单37',20);--三级菜单insert into tb_menu(id, title, parent) values(38, '三级菜单38',21);insert into tb_menu(id, title, parent) values(39, '三级菜单39',22);insert into tb_menu(id, title, parent) values(40, '三级菜单40',23);insert into tb_menu(id, title, parent) values(41, '三级菜单41',24);insert into tb_menu(id, title, parent) values(42, '三级菜单42',25);insert into tb_menu(id, title, parent) values(43, '三级菜单43',26);insert into tb_menu(id, title, parent) values(44, '三级菜单44',27);insert into tb_menu(id, title, parent) values(45, '三级菜单45',28);insert into tb_menu(id, title, parent) values(46, '三级菜单46',28);insert into tb_menu(id, title, parent) values(47, '三级菜单47',29);insert into tb_menu(id, title, parent) values(48, '三级菜单48',30);insert into tb_menu(id, title, parent) values(49, '三级菜单49',31);insert into tb_menu(id, title, parent) values(50, '三级菜单50',31);commit;
2.查找所有上级节点
--查询树状结构某节点(44)的上级所有根节点with cte_parent(id,title,parent)as( --起始条件 select id,title,parent from tb_menu where id = 44 --列出子节点查询条件 union all --递归条件 select a.id,a.title,a.parent from tb_menu a inner join cte_parent b --执行递归,这里就要理解下了 on a.id=b.parent ) select * from cte_parent;
3.查找下级节点带level
--查询树状结构某节点下的所有子节点(with cte_child(id,title,parent,level)as( --起始条件 select id,title,parent,0 as level from tb_menu where id = 6--列出父节点查询条件 union all --递归条件 select a.id,a.title,a.parent,b.level+1 from tb_menu a inner join cte_child b on ( a.parent=b.id) )select * from cte_child;
参考文章
SQL Server 2008中的CTE递归查询 http://www.cnblogs.com/xfrog/archive/2010/10/10/1847462.html
Oracle 树操作(start with…connect by…prior) http://www.cnblogs.com/linjiqin/archive/2013/06/24/3152674.html
"无限极"分类数据表设计的简单再总结 http://www.cnblogs.com/jeffwongishandsome/archive/2010/10/26/1861633.html
菜单
查询
节点
递归
条件
结构
上级
数据
表达式
公用
起始
分类
下级
作用
子句
数据表
文章
标题
百科
目录
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网科技园
华服互联网科技怎么样
科技创新与互联网经济
互联网络科技有限公司
善班互联网科技有限公司
上海致骋互联网科技
开启互联网科技时代小说
中国互联网有什么科技含量
全球顶尖互联网科技公司
互联网科技研发水平
互联网行业科技股
四川慕妮娅互联网科技有限公司
互联网时代的科技公司
每天都有哪些好的互联网科技
黑云互联网科技有限公司
宇信科技在杭州互联网排第几
广州互联网高科技取餐柜
广州燕处互联网科技有限公司
西安左小互联网科技有限公司
第三届互联网大会安防黑科技
厦门中拓互联网络科技有限公司
美国互联网科技
互联网 科技服务平台
新华互联网科技2019
欧洲十大科技互联网公司
互联网经济与金融科技
上海宁丞科技互联网
信承诺互联网科技有限公司
互联网科技大佬云集
每日互联网科技新闻