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

最新文章

  1. [Spring] Spring配置文件中特殊字符的规定
  2. Json操作(DynamicJson)
  3. java Channel filp compact
  4. Help Me with the Game 分类: POJ 2015-06-29 16:34 17人阅读 评论(0) 收藏
  5. Android 改变窗口标题栏的布局
  6. SVG中image tag的高亮
  7. 谈谈对Spring IOC的理解(转载)
  8. springboot开启access_log日志输出
  9. 获取网站证书的两种方法(wireshark or firefox nightly)
  10. dev treelist和searchcontrol组合模糊查询用法
  11. git使用方法收藏
  12. 从SQL Server CloudDBA 看云数据库智能化
  13. Linux 环境下安装Redis的步骤
  14. angular-cli ng build 打包完成后 打开文件显示空白
  15. javascript变量提升详解
  16. 基础知识系列☞关键字→virtual
  17. 20165305 苏振龙《Java程序设计》第四周学习总结
  18. (转) K-Means聚类的Python实践
  19. HTTP协议的前世今生——各版本HTTP协议对比
  20. css 通用兄弟选择器( ~ )

热门文章

  1. vim 外部粘贴代码,如何保持原格式,而不持续缩进
  2. Socket通信(1):搭建开发环境
  3. Spring Boot Metrics监控之Prometheus&amp;Grafana(转)
  4. VS Code 通过文件名查询文件并打开
  5. Leetcode: Stream of Characters
  6. flutter 右滑返回上一页
  7. osg 渲染ifc数据-测试
  8. Qt QLabel加载图片
  9. 【Leetcode_easy】1042. Flower Planting With No Adjacent
  10. keepalived+lvs tcp check 引起的后端服务报Connection reset by peer