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使用工具检测磁盘健康