在论坛中出现的比较难的sql问题:28(循环查询表来实现递归)
2015-11-17 10:19
411 查看
最近,在论坛中,遇到了不少比较难的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
这个怎么查?求解
我的方法:
所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。
问题:怎么循环查询一个表 用递归吗?
有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
这个怎么查?求解
我的方法:
if object_id('[B1]') is not null drop table [B1] go create table [B1]([BID] varchar(6),[sname] varchar(2)) insert [B1] select '1266','JM' union all select '1286','DM' if object_id('[B2]') is not null drop table [B2] go create table [B2]([B2ID] varchar(6),[SID] varchar(6)) insert [B2] select '1266','DH1500' union all select '1266','DH1592' union all select '1266','DH1595' union all select 'DH1500','E89876' union all select 'DH1500','E89896' go --1.定义表变量 DECLARE @a VARCHAR(10) SET @a='JM' declare @tb table ([B2ID] varchar(6), [SID] varchar(6), level int --层级 ) --2.递归开始 insert into @tb SELECT a.* ,1 [level] FROM b2 a LEFT JOIN b2 b ON b.SID=a.b2id WHERE b.b2id IS NULL AND b.SID IS NULL AND a.b2id IN (SELECT bid FROM b1 WHERE [sname]=@a) --3.递归的过程 while @@ROWCOUNT > 0 begin insert into @tb select b.[B2ID],b.[SID],level + 1 from @tb t inner join B2 b on b.b2id =t.SID where not exists(select 1 from @tb t2 where t.level < t2.level) end --4.最后查询 SELECT b2id MainID ,SID FROM @tb /* MainID SID 1266 DH1500 1266 DH1592 1266 DH1595 DH1500 E89876 DH1500 E89896 */
相关文章推荐
- ORA-00604和ORA-04031导致数据库实例宕机
- Java中使用redis的完整实例及常用命令
- 利用redis + lua解决抢红包高并发的问题
- MySQL的子查询及相关优化学习教程
- mongodb 持久化
- Oracle job 定时任务
- Postgresql数据库权限功能小结
- ORACLE 触发器-自动增长列
- 数据库事物隔离级别
- 数据库_MySQL_导入.sql文件与常用指令
- C# asp.net 导出数据库二进制字段到excel
- sqlserver-一次updlock和withnolock和with check option 的报错原因分析
- postgreSQL
- 一些常用SQL语句大全
- Mysql怎么样避免全表扫描,sql查询优化
- 用Navicat向数据库导入数据
- mysql 查找某值在库中的哪一个表那一个字段(半成品)
- 如何查看SQL Server的版本、补丁包信息?以及如何鉴别是否需要升级自己的SQL Server?
- nodejs、express、mongoDB的安装
- MySQL 之 初识SQL