在论坛中出现的比较难的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格式字符串) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
随机推荐
- cv2.imread()
cv2.imread() 使用opencv和caffe的伙伴们,可能会有一个疑问,那就是对于同时读取图片的cv2.imread()和caffe.io.loadimage两个函数,有什么差别? 1.cv ...
- SSIM (Structural SIMilarity) 结构相似性
公式基于样本x和 y 之间的三个比较衡量:亮度 (luminance).对比度 (contrast) 和结构 (structure). 每次计算的时候都从图片上取一个 N*N的窗口,然后不断滑动窗口进 ...
- openresty开发系列21--lua的模块
openresty开发系列21--lua的模块 从lua5.1开始,Lua 加入了标准的模块管理机制,Lua 的模块是由变量.函数等已知元素组成的 table, 因此创建一个模块很简单,就是创建一个 ...
- 【插件式框架探索系列】使用多UI线程提升性能
了解WPF线程模型的都知道,UI线程负责呈现和管理UI,而UI元素(派生自 DispatcherObject)只能由创建该元素的线程来访问,这就导致了一些耗时的UI操作将影 响到整个应用程序性能,未响 ...
- glib 检索地址
http://ftp.acc.umu.se/pub/GNOME/sources/glib/
- CharUtil
package com.opslab.util; import java.io.UnsupportedEncodingException; /** * Various character and ch ...
- 【JAVA】java注解的自定义和使用
java注解概念 Java提供了一种原程序中的元素关联任何信息和任何数据的途径和方法 java注解介绍 常用注解 @Override:表示方法是重写的方法 @Deprecated:过时的方法 @Sup ...
- 如何做ui自动化---步骤详解
第一步: 得到功能测试的常规用例,查看是否可以进行自动化,要明确,自动化不是为了自动化而自动化,自动化是节省人力,主要做回归测试,如果变动性特别大,不建议做自动化,具体可查看其它文章“什么适合做自动化 ...
- c# vs2010 连接access数据库(转)
第一次在博客园写博文,由于文采不怎么好,即使是自己很熟悉的东西,写起来也会感觉到不知从何讲起,我想写的多了就好了. 这篇文章主要是介绍怎么用c# 语言 vs2010连接access数据库的,连接字符串 ...
- golang 使用kcp实例
简介kcp的具体概念与定义自行百度,特性可以浓缩为一句话,和tcp一样可靠,速度比tcp快,是一个用带宽换速度的新型协议.网上的示例代码很少,特此写一篇golang下的kcp实例. PS本文仅对ksp ...
