在论坛中出现的比较难的sql问题:21(递归问题 检索某个节点下所有叶子节点)

时间:2022-05-01 03:38:50

原文:在论坛中出现的比较难的sql问题:21(递归问题 检索某个节点下所有叶子节点)


最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。

所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。

问题:求SQL:检索某个节点下所有叶子节点

部门表名:tb_department

id   int            --节点id

pid int            --父节点id

caption varchar(50) --部门名称

-------------------------------------

id     pid    caption

----------------------------------------------

1       0       AA

20     1      BB

64      20     CC

22     1      DD

23      22     EE

24      1       FF

25     0      GG

26     1      HH

27     25    
II

----------------树状结构如下----------------

--------------------------------------

问:怎么检索出某个节点下的所有最尾端的叶子节点。

例如:想检索AA节点下的所有尾端节点CC,EE,FF,HH?

我的解法,适合sql server 2005及以上的 版本:


  1. create table tb_department(
  2. id int, --节点id
  3. pid int, --父节点id
  4. caption varchar(50) --部门名称
  5. )
  6. insert into tb_department
  7. select 1 ,0 ,'AA' union all
  8. select 20 ,1 ,'BB' union all
  9. select 64 ,20 ,'CC' union all
  10. select 22 , 1 ,'DD' union all
  11. select 23 , 22 ,'EE' union all
  12. select 24 , 1 ,'FF' union all
  13. select 25 , 0 ,'GG' union all
  14. select 26 , 1 ,'HH' union all
  15. select 27 , 25 ,'II'
  16. go
  17. ;with t
  18. as
  19. (
  20. select id,pid,caption
  21. from tb_department
  22. where caption = 'AA'
  23. union all
  24. select t1.id,t1.pid,t1.caption
  25. from t
  26. inner join tb_department t1
  27. on t.id = t1.pid
  28. )
  29. select *
  30. from t
  31. where not exists(select 1 from tb_department t1 where t1.pid = t.id)
  32. /*
  33. id pid caption
  34. 24 1 FF
  35. 26 1 HH
  36. 23 22 EE
  37. 64 20 CC
  38. */

如果是sql server 2000呢,要怎么写呢:


  1. --1.建表
  2. create table tb_department(
  3. id int, --节点id
  4. pid int, --父节点id
  5. caption varchar(50) --部门名称
  6. )
  7. insert into tb_department
  8. select 1 ,0 ,'AA' union all
  9. select 20 ,1 ,'BB' union all
  10. select 64 ,20 ,'CC' union all
  11. select 22 , 1 ,'DD' union all
  12. select 23 , 22 ,'EE' union all
  13. select 24 , 1 ,'FF' union all
  14. select 25 , 0 ,'GG' union all
  15. select 26 , 1 ,'HH' union all
  16. select 27 , 25 ,'II'
  17. go
  18. --2.定义表变量
  19. declare @tb table
  20. (id int, --节点id
  21. pid int, --父节点id
  22. caption varchar(50), --部门名称
  23. level int --层级
  24. )
  25. --3.递归开始
  26. insert into @tb
  27. select *,1 as level
  28. from tb_department
  29. where caption = 'AA'
  30. --4.递归的过程
  31. while @@ROWCOUNT > 0
  32. begin
  33. insert into @tb
  34. select t1.id,t1.pid,t1.caption,level + 1
  35. from @tb t
  36. inner join tb_department t1
  37. on t.id = t1.pid
  38. where not exists(select 1 from @tb t2
  39. where t.level < t2.level)
  40. end
  41. --5.最后查询
  42. select *
  43. from @tb t
  44. where not exists(select 1 from tb_department t1 where t1.pid = t.id)
  45. /*
  46. id pid caption level
  47. 24 1 FF 2
  48. 26 1 HH 2
  49. 64 20 CC 3
  50. 23 22 EE 3
  51. */
在论坛中出现的比较难的sql问题:21(递归问题 检索某个节点下所有叶子节点)
在论坛中出现的比较难的sql问题:21(递归问题 检索某个节点下所有叶子节点)
发布了416 篇原创文章 · 获赞 135 · 访问量 94万+

在论坛中出现的比较难的sql问题:21(递归问题 检索某个节点下所有叶子节点)的更多相关文章

  1. 在论坛中出现的比较难的sql问题:46&lpar;日期条件出现的奇怪问题&rpar;

    原文:在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

  2. 在论坛中出现的比较难的sql问题:45&lpar;用户在线登陆时间的小时、分钟计算问题&rpar;

    原文:在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时.分钟计算问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. ...

  3. 在论坛中出现的比较难的sql问题:44&lpar;触发器专题 明细表插入数据时调用主表对应的数据&rpar;

    原文:在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决 ...

  4. 在论坛中出现的比较难的sql问题:42&lpar;动态行转列 考勤时间动态列&rpar;

    原文:在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  5. 在论坛中出现的比较难的sql问题:41&lpar;循环替换 循环替换关键字&rpar;

    原文:在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  6. 在论坛中出现的比较难的sql问题:40&lpar;子查询 销售和历史库存&rpar;

    原文:在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

  7. 在论坛中出现的比较难的sql问题:39&lpar;动态行转列 动态日期列问题&rpar;

    原文:在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉 ...

  8. 在论坛中出现的比较难的sql问题:38&lpar;字符拆分 字符串检索问题&rpar;

    原文:在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得 ...

  9. 在论坛中出现的比较难的sql问题:37&lpar;动态行转列 某一行数据转为列名&rpar;

    原文:在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  10. 在论坛中出现的比较难的sql问题:36&lpar;动态行转列 解析json格式字符串&rpar;

    原文:在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

随机推荐

  1. 归一化变换 Normalizing transformations

    归一化变换包含两个部分,图像坐标的平移和尺度的缩放.进行归一化的变换不但能够提高处理结果的精确度,而且通过选择一个标准的坐标系预先的消除了图像尺度和坐标原点的选择对算法最终结果的影响. 归一化变换的步 ...

  2. spring mvc定时任务的简单使用

    版权声明:本文为楼主原创文章,未经楼主允许不得转载,如要转载请注明来源. 说起定时任务,开发的小伙伴们肯定不陌生了.有些事总是需要计算机去完成的,而不是傻傻的靠我们自己去.可是好多人对定时器总感觉很陌 ...

  3. css3学习总结2--CSS3圆角边框

    绘制一个圆角边框的示例 .div{ border: solid 5px blue; border-radius: 20px; -moz-border-radius:20px; -o-border-ra ...

  4. Depth-First Search

    深度搜索和宽度搜索对立,宽度搜索是横向搜索(队列实现),而深度搜索是纵向搜索(递归实现): 看下面这个例子: 现在需要驾车穿越一片沙漠,总的行驶路程为L.小胖的吉普装满油能行驶X距离,同时其后备箱最多 ...

  5. cctype学习

    #include <cctype>(转,归纳很好) 头文件描述: 这是一个拥有许多字符串处理函数声明的头文件,这些函数可以用来对单独字符串进行分类和转换: 其中的函数描述: 这些函数传入一 ...

  6. 【重点突破】——two&period;js模拟绘制太阳月亮地球转动

    一.引言 自学two.js第三方绘图工具库,认识到这是一个非常强大的类似转换器的工具,提供一套固定的接口,可用在各种技术下,包括:Canvas.Svg.WebGL,极大的简化了应用的开发.这里,我使用 ...

  7. java开学考试有感以及源码

    一.感想 Java开学测试有感 九月二十号,王老师给我们上的第一节java课,测试. 说实话,不能说是十分有自信,但还好,直到看见了开学测试的题目,之前因为已经做过了王老师发的16级的题目,所以当时还 ...

  8. LeetCode--405--数字转化为十六进制数

    问题描述: 给定一个整数,编写一个算法将这个数转换为十六进制数.对于负整数,我们通常使用 补码运算 方法. 注意: 十六进制中所有字母(a-f)都必须是小写. 十六进制字符串中不能包含多余的前导零.如 ...

  9. springMVC參数传递

    本文是本人在学习网络视屏springMVC的过程中的学习笔记. 为了更便于理解我决定从实际使用的角度解释. 我们在浏览器输入地址 http://localhost:8080/springMVC6/us ...

  10. python3 安装

    Centos7 安装python3 #安装sqlite-devel yum -y install sqlite-devel #安装依赖 yum -y install make zlib zlib-de ...