原文:在论坛中出现的比较难的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. SQL Server 查找空值

    需要查找某一列为空的数据 )NULL不能用 “=”运算符 )NULL不支持+-*/ <> )不同的函数对NULL的支持不一样,使用前要测试,不能靠猜,不能凭经验

  2. layui表格工具条,如何动态控制按钮的展示?

    <script type="text/html" id="toolTpl"> {{# if(d.agrgrtsts == 'A'){ }} < ...

  3. 小D课堂 - 零基础入门SpringBoot2.X到实战_第2节 SpringBoot接口Http协议开发实战_6、SpringBoot2.xHTTP请求配置讲解

    1.SpringBoot2.xHTTP请求配置讲解 简介:SpringBoot2.xHTTP请求注解讲解和简化注解配置技巧 1.@RestController and @RequestMapping是 ...

  4. Android Support v4、v7、v13、v14、v17的区别和应用场景

    Android Support v4.v7.v13.v14.v17的区别和应用场景   本文链接:https://blog.csdn.net/Aquarius_Seven/article/detail ...

  5. ES6深入浅出-12 ES6新增的API(下)-1.录屏

    String.includes es5里面判断字符串是否存在的方法 search searcg的厉害之处是可以使用正则 match正则的方式 repeat -1遍,就不合法 startsWith 判断 ...

  6. ERROR 1130:mysql 1130连接错误的有效解决方法

    今天在用sqlyog连接非本地的Mysql服务器的数据库,居然无法连接很奇怪,报1130错误, ERROR 1130: Host 192.168.3.100 is not allowed to con ...

  7. quasar 报错

    yarn是项目建议安装的方式,报错如下 npm 安装的项目,报错如下 情况:无论是哪种安装方式,似乎报错都出在同一个地方. 近况,还在解决中...

  8. 【物联网】UI设计

    https://designshidai.com/7337.html https://designshidai.com/24908.html http://www.qianqian-ye.com/sm ...

  9. Linux下,postgreSQL的查看与重启

    查看命令:ps aux | grep postgresnetstat -npl | grep postgres 方法1: #su - postgres $pg_ctl restart 方法2: #su ...

  10. mac的公式编辑器: mathtype/latex

    mathtype 收费版,且马上不能在mac系统上使用 latex 搜索一下: ➜ ~ brew search latex ==> Formulae gnome-latex latex2html ...