SQLServer对树节点排序

php中文网
发布: 2016-06-07 15:46:14
原创
1824人浏览过

欢迎进入Windows社区论坛,与300万技术人员互动交流 >>进入 在操作树形数据结构的时候,我们可能会遇到这样的需求:要求把一棵树所有节点排序,比如,在使用easyui树形菜单时,我们通常会在后台做好菜单的排序处理,因为easyui是不会排序的。当然,我们有专

欢迎进入windows社区论坛,与300万技术人员互动交流 >>进入

  在操作树形数据结构的时候,我们可能会遇到这样的需求:要求把一棵树所有节点排序,比如,在使用easyui树形菜单时,我们通常会在后台做好菜单的排序处理,因为easyui是不会排序的。当然,我们有专门的字段OrderNum表示一个节点在同级节点的顺序。

  排序的规则是:

  一、同级节点根据其OrderNum大小先后排序;

  二、不同级级节点根据其同级祖先节点OrderNum大小先后排序;

  测试数据如下:

  SELECT * INTO #Test

  FROM (

  SELECT  1 AS ID--菜单ID

  ,'菜单' AS Name, --菜单名

  0 AS ParentId, --父菜单Id

  1 AS OrderNum   --同级顺序号

  UNION ALL SELECT 2,'文件' AS Name,1 AS ParentId,1

  UNION ALL SELECT 3,'编辑' AS Name,1 AS ParentId,2

  UNION ALL SELECT 4,'工具' AS Name,1 AS ParentId,3

  UNION ALL SELECT 5,'打开' AS Name,2 AS ParentId,1

  UNION ALL SELECT 6,'关闭' AS Name,2 AS ParentId,2

  UNION ALL SELECT 7,'新建' AS Name,2 AS ParentId,3

  UNION ALL SELECT 8,'撤销' AS Name,3 AS ParentId,3

  UNION ALL SELECT 9,'复制' AS Name,3 AS ParentId,2

  UNION ALL SELECT 10,'全选' AS Name,3 AS ParentId,1

  UNION ALL SELECT 11,'选项' AS Name,4 AS ParentId,1) AS tt

  我们构建了一颗树形菜单,现在我们要对这颗树进行排序,我们的目的是使所有同级节点按OrderNum排序,目标结果如下:

  解决方案如下:

  WITH temp as

  (

  SELECT ID, Name, ParentId,CAST(CHAR(OrderNum+65)  as varchar(50)) AS TOrder

  From #Test

  WHERE ParentId = 0

  UNION ALL

  SELECT #Test.ID, #Test.Name, #Test.ParentId, CAST(temp.TOrder+CHAR(#Test.OrderNum+65)AS varchar(50))

  FROM temp

  INNER JOIN #Test

  ON temp.ID = #Test.ParentId

  )

  SELECT *

  FROM temp

  ORDER BY TOrder

  代码其实挺简单的,几点说明:

  一、因为树可能有很多层,涉及不同层节点的OrderNum比较,因此递归是必须的,代码的思想在于根据其在树中的路径来排序。

  二、之前想过用整树来表示某个节点在树中的路径,那样,当同级节点超过9个会有问题,用Acsii转字符串完美解决问题。

SQLServer对树节点排序

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
相关标签:
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号