博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
查询树形的根节点
阅读量:4879 次
发布时间:2019-06-11

本文共 2287 字,大约阅读时间需要 7 分钟。

数据库环境:SQL SERVER 2005

  有一个test表,其表结构及数据如下图1。其中,id是主键,mid是当前节点,pid是父节点。

要求:查出每个节点的根节点,如图2所示。

图1      箭头       图2

  分析:这需求实际上树形查询的扩展,我们可以先找到根节点,从根节点往下找到分支节点,

再从分支节点往下找叶子节点。

  1.数据准备

WITH    x0          AS ( SELECT   1 AS id ,                        'A' AS mid ,                        'B' AS pid               UNION ALL               SELECT   2 AS id ,                        'B' AS mid ,                        'C' AS pid               UNION ALL               SELECT   3 AS id ,                        'C' AS mid ,                        'N' AS pid               UNION ALL               SELECT   4 AS id ,                        'D' AS mid ,                        'E' AS pid               UNION ALL               SELECT   5 AS id ,                        'E' AS mid ,                        'G' AS pid               UNION ALL               SELECT   6 AS id ,                        'G' AS mid ,                        'K' AS pid               UNION ALL               SELECT   7 AS id ,                        'J' AS mid ,                        'H' AS pid             )
View Code

  2.找到根节点

,/*找到没有父节点的节点,即根节点*/        x1          AS ( SELECT   t1.* ,                        t2.mid AS root_flag               FROM     x0 t1                        LEFT JOIN x0 t2 ON t2.mid = t1.pid             )
View Code

  3.递归查询

,/*从根节点往下递归*/        x2 ( id, mid, pid, rid, way )          AS ( SELECT   t1.id ,                        t1.mid ,                        t1.pid ,                        CONVERT(VARCHAR(10), t1.pid) AS rid ,                        CONVERT(VARCHAR(20), t1.pid + ',' + t1.mid) AS way               FROM     x1 t1               WHERE    t1.root_flag IS NULL               UNION ALL               SELECT   t1.id ,                        t1.mid ,                        t1.pid ,                        CONVERT(VARCHAR(10), LEFT(t2.way,                                                  CHARINDEX(',', t2.way) - 1)) AS rid ,                        CONVERT(VARCHAR(20), t2.way + ',' + t1.mid) AS way               FROM     x1 t1                        INNER JOIN x2 t2 ON t2.mid = t1.pid             )    SELECT  id ,            mid ,            pid ,            rid    FROM    x2    ORDER BY id
View Code

  综合整个SQL,test表总共被扫描了4次才实现结果。期待有大神提出更好的解决方法。

转载于:https://www.cnblogs.com/boss-he/p/4808269.html

你可能感兴趣的文章
全栈工程师之路-中级篇之小程序开发-第三章第一节页面跳转及参数传递,跳转到更多页面...
查看>>
[导入][Software]SourceForge Enterprise Edition
查看>>
数据结构——顺序表与链表
查看>>
关于Spring配置文件提示的插件下载
查看>>
软件工程师就业前景
查看>>
asp.net成员管理系统membership详解教程(一)
查看>>
情态动词
查看>>
关于linux的一些基础知识
查看>>
架构漫谈阅读感悟一
查看>>
Android系列之网络(二)----HTTP请求头与响应头
查看>>
数据结构之表(1)顺序表的实现
查看>>
5. git 过滤,让某文件夹里无法提交新添加的文件
查看>>
使用python脚本的3D引擎Panda3d
查看>>
「成长指南」大佬是怎样炼成的
查看>>
CentOS VMware 下SSH配置方法详解
查看>>
【DNN 系列】 添加模块后不显示
查看>>
Java Spring MVC 错误 及 常见问题 总结
查看>>
移动端默认兼容各手机比例
查看>>
案例4-修改商品
查看>>
桥接模式
查看>>