原文:在论坛中出现的比较难的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. 关于Kubernetes Master高可用的一些策略

    关于Kubernetes Master高可用的一些策略 Kubernetes高可用也许是完成了初步的技术评估,打算将生产环境迁移进Kubernetes集群之前普遍面临的问题. 为了减少因为服务器当机引 ...

  2. shell编程系列6--shell中的函数

    shell编程系列6--shell中的函数 .函数介绍 linux shell中的函数和大多数编程语言中的函数一样 将相似的任务或者代码封装到函数中,供其他地方调用 语法格式 第一种格式 name() ...

  3. zookeeper使用过程的错误

    一.zookeeper启动成功,dubbo服务也注册成功,但是服务消费者调用失败 报错如下: [myid:] - INFO [SyncThread:0:ZooKeeperServer@645] - E ...

  4. ubuntu挂载新硬盘

    root@luo-All-Series:~# fdisk -lDisk /dev/loop0: 320.2 MiB, 335728640 bytes, 655720 sectorsUnits: sec ...

  5. matlab基本函数randperm end数组索引

    一起来学演化计算-matlab基本函数randperm end数组索引 觉得有用的话,欢迎一起讨论相互学习~Follow Me 随机排列 语法 p = randperm(n) p = randperm ...

  6. Python数据抓取技术与实战 pdf

    Python数据抓取技术与实战 目录 D11章Python基础1.1Python安装1.2安装pip1.3如何查看帮助1.4D1一个实例1.5文件操作1.6循环1.7异常1.8元组1.9列表1.10字 ...

  7. java 特殊字符处理

    // 去除富文本中的html标签 // <p>段落替换为换行 content = content.replaceAll("<p .*?>", "\ ...

  8. c# 子线程与主线程通信二

    之前写过使用线程上下文实现线程同步,今天利用子线程向主线程发送事件,实现子线程与主线程的同步 基本步骤 1.定义类 using System; using System.Collections.Gen ...

  9. JS中的match和test正则表达式验证密码或用户名的一种规则

    match语法:字符串.match(正则表达式)有符合的:返回符合的数组无符合的:返回null test语法:正则表达式.test(字符串)有符合的:返回true无符合的 :返回false 该文的密码 ...

  10. canvas《砸肉蛋》

    计划今年要自己写几个游戏的demo,先从<砸地鼠>这种简单的入手. 游戏思路 卡通化前端组头像 两种状态(快乐&被砸) 游戏时间1分钟 微信接口,分享最终得分 游戏规则 前端组的肉 ...