您的位置:首页 > 数据库

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

2015-11-17 10:19 411 查看
最近,在论坛中,遇到了不少比较难的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 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
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: