最近,在论坛中,遇到了不少比较难的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
-
*/