在论坛中出现的比较难的sql问题:28(循环查询表来实现递归)
原文:在论坛中出现的比较难的sql问题:28(循环查询表来实现递归)
                          
所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。
问题:怎么循环查询一个表 用递归吗?
有2张表B1和B2,B1是主表,
B1的BID是对应B2的B2ID,
B1和B2d是一对多的关系,
B2ID下还有以它为父节点的数据,测试数据如下:
B1
BID sname
1266   JM          
1286   DM
......        
B2
B2ID SID
1266   DH1500          
1266   DH1592
1266   DH1595
DH1500   E89876
DH1500   E89896
联合2表查询,要得到这样的结果:
MainID SID
1266 DH1500
1266 DH1592
1266 DH1595
DH1500   E89876
DH1500   E89896
这个怎么查?求解
我的方法:
- 
if object_id('[B1]') is not null drop table [B1]
 
- 
go 
 
- 
create table [B1]([BID] varchar(6),[sname] varchar(2))
 
- 
insert [B1]
 
- 
select '1266','JM' union all
 
- 
select '1286','DM'
 
- 
 
 
- 
if object_id('[B2]') is not null drop table [B2]
 
- 
go 
 
- 
create table [B2]([B2ID] varchar(6),[SID] varchar(6))
 
- 
insert [B2]
 
- 
select '1266','DH1500' union all
 
- 
select '1266','DH1592' union all
 
- 
select '1266','DH1595' union all
 
- 
select 'DH1500','E89876' union all
 
- 
select 'DH1500','E89896'
 
- 
go
 
- 
 
 
- 
 
 
- 
 
 
- 
--1.定义表变量
 
- 
 
 
- 
DECLARE @a VARCHAR(10)
 
- 
SET @a='JM'
 
- 
 
 
- 
declare @tb table
 
- 
([B2ID] varchar(6),
 
- 
[SID] varchar(6),
 
- 
level int       --层级
 
- 
)
 
- 
 
 
- 
 
 
- 
--2.递归开始  
 
- 
insert into @tb 
 
- 
SELECT a.* ,1 [level]
 
- 
FROM b2 a LEFT JOIN b2 b ON b.SID=a.b2id
 
- 
WHERE b.b2id IS NULL AND b.SID IS NULL AND a.b2id IN (SELECT bid FROM b1 WHERE [sname]=@a)
 
- 
 
 
- 
 
 
- 
--3.递归的过程
 
- 
while @@ROWCOUNT > 0
 
- 
begin
 
- 
    
 
- 
    insert into @tb
 
- 
	select b.[B2ID],b.[SID],level + 1
 
- 
	from @tb t
 
- 
	inner join B2 b
 
- 
			on b.b2id =t.SID
 
- 
    where not exists(select 1 from @tb t2 
 
- 
                     where t.level < t2.level)
 
- 
end
 
- 
 
 
- 
 
 
- 
--4.最后查询
 
- 
SELECT b2id MainID    ,SID
 
- 
 FROM  @tb
 
- 
/*
 
- 
MainID	SID
 
- 
1266	DH1500
 
- 
1266	DH1592
 
- 
1266	DH1595
 
- 
DH1500	E89876
 
- 
DH1500	E89896
 
- 
*/
 
在论坛中出现的比较难的sql问题:28(循环查询表来实现递归)的更多相关文章
- 在论坛中出现的比较难的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格式字符串) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
 
随机推荐
- 关于Kubernetes Master高可用的一些策略
			
关于Kubernetes Master高可用的一些策略 Kubernetes高可用也许是完成了初步的技术评估,打算将生产环境迁移进Kubernetes集群之前普遍面临的问题. 为了减少因为服务器当机引 ...
 - shell编程系列6--shell中的函数
			
shell编程系列6--shell中的函数 .函数介绍 linux shell中的函数和大多数编程语言中的函数一样 将相似的任务或者代码封装到函数中,供其他地方调用 语法格式 第一种格式 name() ...
 - zookeeper使用过程的错误
			
一.zookeeper启动成功,dubbo服务也注册成功,但是服务消费者调用失败 报错如下: [myid:] - INFO [SyncThread:0:ZooKeeperServer@645] - E ...
 - ubuntu挂载新硬盘
			
root@luo-All-Series:~# fdisk -lDisk /dev/loop0: 320.2 MiB, 335728640 bytes, 655720 sectorsUnits: sec ...
 - matlab基本函数randperm end数组索引
			
一起来学演化计算-matlab基本函数randperm end数组索引 觉得有用的话,欢迎一起讨论相互学习~Follow Me 随机排列 语法 p = randperm(n) p = randperm ...
 - Python数据抓取技术与实战 pdf
			
Python数据抓取技术与实战 目录 D11章Python基础1.1Python安装1.2安装pip1.3如何查看帮助1.4D1一个实例1.5文件操作1.6循环1.7异常1.8元组1.9列表1.10字 ...
 - java 特殊字符处理
			
// 去除富文本中的html标签 // <p>段落替换为换行 content = content.replaceAll("<p .*?>", "\ ...
 - c# 子线程与主线程通信二
			
之前写过使用线程上下文实现线程同步,今天利用子线程向主线程发送事件,实现子线程与主线程的同步 基本步骤 1.定义类 using System; using System.Collections.Gen ...
 - JS中的match和test正则表达式验证密码或用户名的一种规则
			
match语法:字符串.match(正则表达式)有符合的:返回符合的数组无符合的:返回null test语法:正则表达式.test(字符串)有符合的:返回true无符合的 :返回false 该文的密码 ...
 - canvas《砸肉蛋》
			
计划今年要自己写几个游戏的demo,先从<砸地鼠>这种简单的入手. 游戏思路 卡通化前端组头像 两种状态(快乐&被砸) 游戏时间1分钟 微信接口,分享最终得分 游戏规则 前端组的肉 ...
 
			
		