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

原文: 在论坛中出现的比较难的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

这个怎么查?求解 

我的方法:


   
   
  1. if object_id('[B1]') is not null drop table [B1]
  2. go
  3. create table [B1]([BID] varchar( 6),[sname] varchar( 2))
  4. insert [B1]
  5. select '1266', 'JM' union all
  6. select '1286', 'DM'
  7. if object_id( '[B2]') is not null drop table [B2]
  8. go
  9. create table [B2]([B2ID] varchar( 6),[ SID] varchar( 6))
  10. insert [B2]
  11. select '1266', 'DH1500' union all
  12. select '1266', 'DH1592' union all
  13. select '1266', 'DH1595' union all
  14. select 'DH1500', 'E89876' union all
  15. select 'DH1500', 'E89896'
  16. go
  17. --1.定义表变量
  18. DECLARE @a VARCHAR( 10)
  19. SET @a= 'JM'
  20. declare @tb table
  21. ([B2ID] varchar( 6),
  22. [ SID] varchar( 6),
  23. level int --层级
  24. )
  25. --2.递归开始
  26. insert into @tb
  27. SELECT a.* , 1 [ level]
  28. FROM b2 a LEFT JOIN b2 b ON b.SID=a.b2id
  29. WHERE b.b2id IS NULL AND b.SID IS NULL AND a.b2id IN ( SELECT bid FROM b1 WHERE [sname]=@a)
  30. --3.递归的过程
  31. while @@ROWCOUNT > 0
  32. begin
  33. insert into @tb
  34. select b.[B2ID],b.[ SID], level + 1
  35. from @tb t
  36. inner join B2 b
  37. on b.b2id =t.SID
  38. where not exists( select 1 from @tb t2
  39. where t.level < t2.level)
  40. end
  41. --4.最后查询
  42. SELECT b2id MainID , SID
  43. FROM @tb
  44. /*
  45. MainID SID
  46. 1266 DH1500
  47. 1266 DH1592
  48. 1266 DH1595
  49. DH1500 E89876
  50. DH1500 E89896
  51. */

发布了416 篇原创文章 · 获赞 135 · 访问量 94万+

猜你喜欢

转载自www.cnblogs.com/lonelyxmas/p/12020053.html
今日推荐