sqlserver实现树形结构递归查询(无限极分类)
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,SQL Server 2005开始,我们可以直接通过CTE来支持递归查询,CTE即公用表表达式百度百科公用表表达式(CTE),是一个在查询中定义的临时命名结果集将在from子句中使用它。每个CTE仅被
千家信息网最后更新 2025年12月02日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安全错误
数据库的锁怎样保障安全
杨浦区会计网络技术咨询报价
球探数据库
为什么我的歌曲和服务器连接不了
彩票软件开发需要什么语言
王雷网络安全
软件开发自我评价
CAD软件开发 书
搭建渲染服务器
延吉德高软件开发公司
pg数据库怎么查锁
杭州网络安全实战培训哪里学
网络安全技能大赛意义
数据库使用痕迹查询
mc服务器ip地址怎么改
对中文数据库学习
服务器三秒一滴
数据库用户信息表保存
香港服务器如何防止被屏蔽
浪潮服务器集成商
win10英雄联盟无法连接服务器
软件开发项目中遇到的困难
广东软件开发者需要什么
字牌app软件开发公司
数据库管理技术人工管理阶段
计算机网络技术常用编码方式
mc服务器ip地址怎么改
tcp协议与网络安全
wincc复制项目服务器不可用
重庆联通服务器托管怎么样
数据库删除行语法