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

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

  1. 在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题)

    原文:在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

  2. 在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时、分钟计算问题)

    原文:在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时.分钟计算问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. ...

  3. 在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据)

    原文:在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决 ...

  4. 在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列)

    原文:在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  5. 在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字)

    原文:在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  6. 在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存)

    原文:在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

  7. 在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)

    原文:在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉 ...

  8. 在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题)

    原文:在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得 ...

  9. 在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名)

    原文:在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  10. 在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串)

    原文:在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

随机推荐

  1. Java默认文件目录

    今天看到Ehcache中设置持久化的配置: <diskStore path="java.io.tmpdir" /> 好奇这个java.io.temdir是哪个目录,于是 ...

  2. 阿里云EDAS功能简介

    尊敬的 EDAS 用户: 您好!为了给您带来更好的服务和使用体验,EDAS 产品团队将对 EDAS 标准版(含按量付费和包年包月)进行一轮调整,包括按量付费标准版价格和免费额度的更新,以及标准版套餐的 ...

  3. Python3入门(十三)——连接数据库

    以Mysql为例: 要操作关系数据库,首先需要连接到数据库,一个数据库连接称为Connection: 连接到数据库后,需要打开游标,称之为Cursor,通过Cursor执行SQL语句,然后,获得执行结 ...

  4. Spring cloud微服务安全实战-6-7jwt改造总结

    限流的改造. 同样注意,不要声明成Spring的Bean 在上面声明Rateliiter 如果能获取到权限继续往下走,没权限就返回,to many request的错误信息. 加到过滤器链上 加载Sp ...

  5. 【FreeMarker】Spring MVC与FreeMarker整合(二)

    前一篇介绍了FreeMarker的基本使用,本例介绍Spring MVC与FreeMarker整合 不熟悉项目搭建,可参考 [FreeMarker]FreeMarker快速入门(一) 整合 1.新建S ...

  6. pycharm远程SSH调用服务器python解释器教程

    该教程主要介绍pycharm远程SSH调用解释器以及建立SFTP文件传输协议: 第一步:建立SSH连接: 第二步:建立SFTP协议: (1)SSH: 配置远程python解释器 这里主要讲的是如何配置 ...

  7. Unity3d基于Socket通讯例子(转)

    按语:按照下文,服务端利用网络测试工具,把下面客户端代码放到U3D中摄像机上,运行结果正确. http://www.manew.com/thread-102109-1-1.html 在一个网站上看到有 ...

  8. Python - Django - ORM 分组查询补充

    单表查询: models.py: from django.db import models class Employee(models.Model): name = models.CharField( ...

  9. 客户端业务层(非数据层json或xml层)的数据结构

    private string errorMessage = "系统繁忙,请稍后重试";//不成功时的提示信息:成功时,可以忽略掉        private int result ...

  10. Cas(09)——通过Proxy访问其它Cas应用

    通过Proxy访问其它Cas应用 目录 1.1     原理 1.2     配置 1.2.1    代理端 1.2.2    被代理端 1.3     请求示例 考虑这样一种场景:有两个应用App1 ...