在论坛中出现的比较难的sql问题:21(递归问题 检索某个节点下所有叶子节点)
原文:在论坛中出现的比较难的sql问题:21(递归问题 检索某个节点下所有叶子节点)
所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。
问题:求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及以上的 版本:
-
create table tb_department(
-
id int, --节点id
-
pid int, --父节点id
-
caption varchar(50) --部门名称
-
)
-
-
insert into tb_department
-
select 1 ,0 ,'AA' union all
-
select 20 ,1 ,'BB' union all
-
select 64 ,20 ,'CC' union all
-
select 22 , 1 ,'DD' union all
-
select 23 , 22 ,'EE' union all
-
select 24 , 1 ,'FF' union all
-
select 25 , 0 ,'GG' union all
-
select 26 , 1 ,'HH' union all
-
select 27 , 25 ,'II'
-
go
-
-
-
;with t
-
as
-
(
-
select id,pid,caption
-
from tb_department
-
where caption = 'AA'
-
-
union all
-
-
select t1.id,t1.pid,t1.caption
-
from t
-
inner join tb_department t1
-
on t.id = t1.pid
-
)
-
-
select *
-
from t
-
where not exists(select 1 from tb_department t1 where t1.pid = t.id)
-
/*
-
id pid caption
-
24 1 FF
-
26 1 HH
-
23 22 EE
-
64 20 CC
-
*/
如果是sql server 2000呢,要怎么写呢:
-
--1.建表
-
create table tb_department(
-
id int, --节点id
-
pid int, --父节点id
-
caption varchar(50) --部门名称
-
)
-
-
insert into tb_department
-
select 1 ,0 ,'AA' union all
-
select 20 ,1 ,'BB' union all
-
select 64 ,20 ,'CC' union all
-
select 22 , 1 ,'DD' union all
-
select 23 , 22 ,'EE' union all
-
select 24 , 1 ,'FF' union all
-
select 25 , 0 ,'GG' union all
-
select 26 , 1 ,'HH' union all
-
select 27 , 25 ,'II'
-
go
-
-
-
--2.定义表变量
-
declare @tb table
-
(id int, --节点id
-
pid int, --父节点id
-
caption varchar(50), --部门名称
-
level int --层级
-
)
-
-
-
--3.递归开始
-
insert into @tb
-
select *,1 as level
-
from tb_department
-
where caption = 'AA'
-
-
-
--4.递归的过程
-
while @@ROWCOUNT > 0
-
begin
-
-
insert into @tb
-
select t1.id,t1.pid,t1.caption,level + 1
-
from @tb t
-
inner join tb_department t1
-
on t.id = t1.pid
-
where not exists(select 1 from @tb t2
-
where t.level < t2.level)
-
end
-
-
-
--5.最后查询
-
select *
-
from @tb t
-
where not exists(select 1 from tb_department t1 where t1.pid = t.id)
-
/*
-
id pid caption level
-
24 1 FF 2
-
26 1 HH 2
-
64 20 CC 3
-
23 22 EE 3
-
*/
在论坛中出现的比较难的sql问题:21(递归问题 检索某个节点下所有叶子节点)的更多相关文章
- 在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题)
原文:在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...
- 在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时、分钟计算问题)
原文:在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时.分钟计算问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. ...
- 在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据)
原文:在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决 ...
- 在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列)
原文:在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字)
原文:在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存)
原文:在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...
- 在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)
原文:在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉 ...
- 在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题)
原文:在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得 ...
- 在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名)
原文:在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串)
原文:在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
随机推荐
- Python 设计模式之建造者模式 Builder Pattern
#引入建造者模式 肯德基的菜单上有 薯条, 鸡腿,鸡翅,鸡米花,可乐,橙汁,火腿汉堡,至尊虾汉堡,牛肉汉堡 , 鸡肉卷等这些单品,也有很多套餐. 比如 套餐1:鸡翅,至尊虾汉堡,可乐,薯条 套餐2:鸡 ...
- FFmpeg编译:mac下编译iOS平台的FFmpeg库(支持armv7, arm64, i386, x86_64)
环境:FFmpeg 3.4.6Xcode 10.3macOS 10.14.6iOS SDK 12.4 一.准备工作 1. 下载FFmpeg我这里使用的是3.4.6版本的FFmpeg,可以从FFmpeg ...
- Blockchain & BPM
http://www.infoq.com/cn/news/2018/07/blockchain-BPM?utm_source=notification_email&utm_campaign=n ...
- 字典树(查找树) leetcode 208. Implement Trie (Prefix Tree) 、211. Add and Search Word - Data structure design
字典树(查找树) 26个分支作用:检测字符串是否在这个字典里面插入.查找 字典树与哈希表的对比:时间复杂度:以字符来看:O(N).O(N) 以字符串来看:O(1).O(1)空间复杂度:字典树远远小于哈 ...
- centos7设置rsyslog日志服务集中服务器
centos7设置rsyslog日志服务集中服务器 环境:centos6.9_x86_64,自带的rsyslog版本是7.4.7,很多配置都不支持,于是进行升级后配置 # 安装新版本的rsyslog程 ...
- MFC加载osg模型
创建MFC单文档项目, OSGObject.h #pragma once #include <osgViewer\Viewer> #include <osgDB\ReadFile&g ...
- 软件定义网络基础---OpenFlow协议
一:OpenFlow协议概述 OpenFlow协议为控制器与交换机之间的通信,提供了一种开放标准的方式.OpenFlow交换机通过安全通道与控制器进行信息交互 二:OpenFlow消息类型 (一)co ...
- 软件定义网络基础---OF-Config协议
交换机与控制器继续通信前,是需要对其功能.特性以及资源进行配置才能进行工作,这些配置是如何实现的?是由专门的配置协议指导完成的 一:OF-Config协议 是OpenFlow交换机管理配置协议,是Op ...
- locust设置断言的方法
https://blog.csdn.net/panyu881024/article/details/80146088 这里同样以测试百度首页为例. catch_response = True :布尔类 ...
- c# Invoke的新用法
在C# 3.0及以后的版本中有了Lamda表达式,像上面这种匿名委托有了更简洁的写法..NET Framework 3.5及以后版本更能用Action封装方法.例如以下写法可以看上去非常简洁: voi ...