Sql递归原理
递归最少包括两个查询(也被称为成员)。第一个查询为定点成员,定点成员只是一个返回有效表的查询,用于递归的基础或定位点。第二个查询被称为递归成员,使该查询成为递归成员的是对递归引用时触发(递归表.id与该表的pid)。在逻辑上,可以将其理解为是前一个查询语句的子集。递归查询没有显式的递归终止条件,只有当第二个递归查询返回空结果集或是超出了递归次数的最大限制时才停止递归。递归次数上限的方法是使用MAXRECURION:后接OPTION (MAXRECURSION 0) --排除限值
Sql递归案例
SQL Server中
- 日期范围递归:
with wt_temp(orderby,mydate) as (select 1 orderby,convert(varchar(10),'2020-01-01',120) union all select orderby+1, convert(varchar(10),dateadd(DD,1,mydate),120) from wt_temp where mydate < '2020-01-05' ) select * from wt_temp
- 树查询:一般用于菜单/权限/分类等。
create table [#temp]( [id] [int] null, [pid] [int] null, [name] [nchar](10) ) go insert into #temp values(1,0,'a') insert into #temp values(2,0,'b') insert into #temp values(3,1,'c') insert into #temp values(4,1,'d') insert into #temp values(5,2,'e') insert into #temp values(6,3,'f') insert into #temp values(7,3,'g') insert into #temp values(8,4,'h') go --由子结点递归父项 with my1 as(select * from #temp where id = 1 union all select #temp.* from my1, #temp where my1.id = #temp.pid ) select * from my1 --由父结点递归子项 with my2 as(select * from #temp where id = 8 union all select #temp.* from my2, #temp where my2.pid = #temp.id ) select * from my2
Oracle中
使用语法:connect by (prior) t.parent_id = (prior) t.id start with id = ??
prior 只有一个,在不同的位置查不同的结果.prior 在前查前辈,prior在后查后生。
with wt_temp(orderby,mydate) as (select 1 orderby,convert(varchar(10),'2020-01-01',120) union all select orderby+1, convert(varchar(10),dateadd(DD,1,mydate),120) from wt_temp where mydate < '2020-01-05' ) select * from wt_temp
分类:
技术分享
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现