在论坛中出现的比较难的sql问题:28(循环查询表来实现递归)
2024-08-27 00:42:57
原文:在论坛中出现的比较难的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
这个怎么查?求解
我的方法:
-
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
-
*/
最新文章
- [Spring] Spring配置文件中特殊字符的规定
- Json操作(DynamicJson)
- java Channel filp compact
- Help Me with the Game 分类: POJ 2015-06-29 16:34 17人阅读 评论(0) 收藏
- Android 改变窗口标题栏的布局
- SVG中image tag的高亮
- 谈谈对Spring IOC的理解(转载)
- springboot开启access_log日志输出
- 获取网站证书的两种方法(wireshark or firefox nightly)
- dev treelist和searchcontrol组合模糊查询用法
- git使用方法收藏
- 从SQL Server CloudDBA 看云数据库智能化
- Linux 环境下安装Redis的步骤
- angular-cli ng build 打包完成后 打开文件显示空白
- javascript变量提升详解
- 基础知识系列☞关键字→virtual
- 20165305 苏振龙《Java程序设计》第四周学习总结
- (转) K-Means聚类的Python实践
- HTTP协议的前世今生——各版本HTTP协议对比
- css 通用兄弟选择器( ~ )
热门文章
- vim 外部粘贴代码,如何保持原格式,而不持续缩进
- Socket通信(1):搭建开发环境
- Spring Boot Metrics监控之Prometheus&;Grafana(转)
- VS Code 通过文件名查询文件并打开
- Leetcode: Stream of Characters
- flutter 右滑返回上一页
- osg 渲染ifc数据-测试
- Qt QLabel加载图片
- 【Leetcode_easy】1042. Flower Planting With No Adjacent
- keepalived+lvs tcp check 引起的后端服务报Connection reset by peer