SqlServer使用公用表表达式(CTE)实现无限级树形构建
发布时间 - 2026-01-11 02:59:06 点击率:次SQL Server 2005开始,我们可以直接通过CTE来支持递归查询,CTE即公用表表达式

公用表表达式(CTE),是一个在查询中定义的临时命名结果集将在from子句中使用它。每个CTE仅被定义一次(但在其作用域内可以被引用任意次),并且在该查询生存期间将一直生存。可以使用CTE来执行递归操作。
DECLARE @Level INT=3
;WITH cte_parent(CategoryID,CategoryName,ParentCategoryID,Level)
AS
(
SELECT category_id,category_name,parent_category_id,1 AS Level
FROM TianShenLogistic.dbo.ProductCategory WITH(NOLOCK)
WHERE category_id IN
(
SELECT category_id
FROM TianShenLogistic.dbo.ProductCategory
WHERE parent_category_id=0
)
UNION ALL
SELECT b.category_id,b.category_name,b.parent_category_id,a.Level+1 AS Level
FROM TianShenLogistic.dbo.ProductCategory b
INNER JOIN cte_parent a
ON a.CategoryID = b.parent_category_id
)
SELECT
CategoryID AS value,
CategoryName as label,
ParentCategoryID As parentId,
Level
FROM cte_parent WHERE Level <=@Level;
public static List<LogisticsCategoryTreeEntity> GetLogisticsCategoryByParent(int? level)
{
if (level < 1) return null;
var dataResult = CategoryDA.GetLogisticsCategoryByParent(level);
var firstlevel = dataResult.Where(d => d.level == 1).ToList();
BuildCategory(dataResult, firstlevel);
return firstlevel;
}
private static void BuildCategory(List<LogisticsCategoryTreeEntity> allCategoryList, List<LogisticsCategoryTreeEntity> categoryList)
{
foreach (var category in categoryList)
{
var subCategoryList = allCategoryList.Where(c => c.parentId == category.value).ToList();
if (subCategoryList.Count > 0)
{
if (category.children == null) category.children = new List<LogisticsCategoryTreeEntity>();
category.children.AddRange(subCategoryList);
BuildCategory(allCategoryList, category.children);
}
}
}
# sqlserver
# 构建树形结构
# sql
# sqlserver无限级树形结构
# Mysql8公用表表达式CTE详解
# MySQL8.0之CTE(公用表表达式)的使用
# SQL Server使用T-SQL进阶之公用表表达式(CTE)
# mysql8 公用表表达式CTE的使用方法实例分析
# sql server使用公用表表达式CTE通过递归方式编写通用函数自动生成连续数字和日期
# SQL Server 公用表表达式(CTE)实现递归的方法
# 关于SQL中CTE(公用表表达式)(Common Table Expression)的总结
# SQL2005 学习笔记 公用表表达式(CTE)
# SqlServer公用表表达式(CTE)的具体使用
# 递归
# 是一个
# 将在
# 但在
# 可以直接
# 可以使用
# 句中
# 使用它
# SELECT
# category_id
# ParentCategoryID
# CategoryID
# cte_parent
# CategoryName
# TianShenLogistic
# dbo
# ProductCategory
# category_name
# parent_category_id
# NOLOCK
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权
C语言设计一个闪闪的圣诞树
Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用
如何在云指建站中生成FTP站点?
开心动漫网站制作软件下载,十分开心动画为何停播?
BootStrap整体框架之基础布局组件
Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
Claude怎样写约束型提示词_Claude约束提示词写法【教程】
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】
js实现获取鼠标当前的位置
如何在腾讯云服务器快速搭建个人网站?
文字头像制作网站推荐软件,醒图能自动配文字吗?
如何在云主机快速搭建网站站点?
如何在Tomcat中配置并部署网站项目?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
JavaScript如何实现类型判断_typeof和instanceof有什么区别
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
使用Dockerfile构建java web环境
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
Laravel怎么实现验证码(Captcha)功能
详解MySQL数据库的安装与密码配置
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
如何快速完成中国万网建站详细流程?
如何在IIS中配置站点IP、端口及主机头?
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
如何在阿里云虚拟主机上快速搭建个人网站?
如何在万网主机上快速搭建网站?
在线制作视频网站免费,都有哪些好的动漫网站?
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
在线制作视频的网站有哪些,电脑如何制作视频短片?
Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】
C++用Dijkstra(迪杰斯特拉)算法求最短路径
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
Laravel如何发送系统通知?(Notification渠道示例)
Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
如何在 Pandas 中基于一列条件计算另一列的分组均值
php增删改查怎么学_零基础入门php数据库操作必知基础【教程】
Bootstrap整体框架之CSS12栅格系统
Laravel如何配置和使用缓存?(Redis代码示例)
Laravel如何实现API版本控制_Laravel API版本化路由设计策略
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
如何在宝塔面板中修改默认建站目录?
利用vue写todolist单页应用
Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康

