在论坛中出现的比较难的sql问题:28(循环查询表来实现递归)

你。 提交于 2019-12-11 01:05:02
原文:在论坛中出现的比较难的sql问题:28(循环查询表来实现递归)

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

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


问题:怎么循环查询一个表 用递归吗?

有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 allselect '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 allselect '1266','DH1592' union allselect '1266','DH1595' union allselect 'DH1500','E89876' union allselect '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.b2idWHERE b.b2id IS NULL AND b.SID IS NULL AND a.b2id IN (SELECT bid FROM b1 WHERE [sname]=@a)  --3.递归的过程while @@ROWCOUNT > 0begin        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	SID1266	DH15001266	DH15921266	DH1595DH1500	E89876DH1500	E89896*/

发布了416 篇原创文章 · 获赞 135 · 访问量 94万+
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!