SQLServer CTE递归

SQL SERVER中CTE语句结构及CTE递归查询 用实例数据解释SQL SERVER中的CTE语句及CTE递归查询 阅读详情

转自https://blog.youkuaiyun.com/wikey_zhang/article/details/72639546

首先,我们新建一张测试用的临时表#country,其中包含三个字段,AreaNam(地名) ,BelongTo(上级地名) ,Msg(地方简介)

[sql]  view plain  copy
  1. Create table #country (AreaNam NVARCHAR(10),BelongTo Nvarchar(10),Msg varchar(100))  

下面我们往这张表里插入一堆测试数据:

[sql]  view plain  copy
  1. INSERT INTO #country  
  2. SELECT '中国','中国',null union all  
  3. SELECT '江苏','中国',null union all  
  4. SELECT '南京','江苏',null union all  
  5. SELECT '无锡','江苏',null union all  
  6. SELECT '徐州','江苏',null union all  
  7. SELECT '扬州','江苏',null union all  
  8. SELECT '苏州','江苏',null union all  
  9. SELECT '六合区','南京',null union all  
  10. SELECT '江宁区','南京',null union all  
  11. SELECT '浦口区','南京',null union all  
  12. SELECT '仙林区','南京',null union all  
  13. SELECT '建邺区','南京',null union all  
  14. SELECT '宝应','扬州',null union all  
  15. SELECT '仪征','扬州',null union all  
  16. SELECT '小官庄','宝应',null union all  
  17. SELECT '范水','宝应',null union all  
  18. SELECT '鲁垛','宝应',null union all  
  19. SELECT '安宜','宝应',null union all  
  20. SELECT '组全','小官庄',null union all  
  21. SELECT '房桥','小官庄',null union all  
  22. SELECT '直下沟','小官庄',null union all  
  23. SELECT '山东','中国',null union all  
  24. SELECT '济南','山东',null union all  
  25. SELECT '青岛','山东',null union all  
  26. SELECT '淄博','山东',null union all  
  27. SELECT '烟台','山东',null union all  
  28. SELECT '张店','淄博',null union all  
  29. SELECT '博山','淄博',null union all  
  30. SELECT '淄川','淄博',null union all  
  31. SELECT '龙王山','浦口区',null union all  
  32. SELECT '高新区','浦口区',null union all  
  33. SELECT '陆军指挥学院','浦口区',null union all  
  34. SELECT '南京信息工程大学','浦口区',null union all  
  35. SELECT '金陵学院','浦口区',null  

到这里,表结构已经完成了,这张表的表结构应该不难理解。

但是下面问题来了,有要求查找出南京包含南京以内(属于南京)的所有地名,因为如果数据量比较大的话,我们根本无法确定一个城市往下分了多少级地名,如果分的层级太多的话,使用循环取实现查询结果也是一个可行的方案,sql如下:

[sql]  view plain  copy
  1. DECLARE @CITY NVARCHAR(MAX)='南京'  
  2. Create table #TEMP (AreaNam NVARCHAR(10),BelongTo Nvarchar(10),Msg varchar(100))  
  3. Create table #tempAreaname (AreaNam NVARCHAR(10))  
  4. Create table #tempAreanametemp (AreaNam NVARCHAR(10))  
  5. INSERT INTO #tempAreaname   
  6. SELECT @CITY  
  7. INSERT INTO #TEMP  
  8. SELECT * FROM #country WHERE AreaNam=@CITY  
  9. WHILE 1=1  
  10. BEGIN  
  11.     insert into #tempAreanametemp  
  12.     SELECT areanam  FROM #country WHERE belongto IN(select areanam from #tempAreaname)  
  13.   
  14.     IF @@ROWCOUNT<>0  
  15.     BEGIN   
  16.         INSERT INTO #TEMP  
  17.         SELECT * FROM #country WHERE belongto IN(select areanam from #tempAreaname)  
  18.         delete from #tempAreaname  
  19.         insert into #tempAreaname  
  20.         select * from #tempAreanametemp  
  21.         delete from #tempAreanametemp         
  22.     END  
  23.     ELSE  
  24.     BEGIN     
  25.         SELECT * FROM #TEMP  
  26.         DROP TABLE #TEMP  
  27.         DROP TABLE #tempAreaname  
  28.         DROP TABLE #tempAreanametemp  
  29.         RETURN  
  30.     END  
  31. END  
查询结果如下:

AreaNam BelongTo Msg
南京 江苏 NULL
六合区 南京 NULL
江宁区 南京 NULL
浦口区 南京 NULL
仙林区 南京 NULL
建邺区 南京 NULL
龙王山 浦口区 NULL
高新区 浦口区 NULL
陆军指挥学院 浦口区 NULL
南京信息工程大学 浦口区 NULL
金陵学院 浦口区 NULL


这正是我们所想要的结果,但是总感觉这写法太复杂而且执行效率也不是很高,当然啦用循环去写的话肯定也有简单一点的写法的,这不是我们今天的重点。今天的重点是用CTE递归的方式去实现我们所想要的结果,SQL如下:

[sql]  view plain  copy
  1. WITH CTE AS (  
  2. SELECT AreaNam,BelongTo,Msg FROM #country WHERE AreaNam='南京'  
  3. UNION ALL  
  4. SELECT  A.AreaNam,A.BelongTo,A.Msg FROM #country A INNER JOIN CTE B ON A.BelongTo=B.AreaNam  
  5. )  
  6. SELECT * FROM CTE  
[sql]  view plain  copy
  1.   
[sql]  view plain  copy
  1. 查询结果也是一样一样的:  
[sql]  view plain  copy
  1. AreaNam BelongTo Msg  
  2. 南京 江苏 NULL  
  3. 六合区 南京 NULL  
  4. 江宁区 南京 NULL  
  5. 浦口区 南京 NULL  
  6. 仙林区 南京 NULL  
  7. 建邺区 南京 NULL  
  8. 龙王山 浦口区 NULL  
  9. 高新区 浦口区 NULL  
  10. 陆军指挥学院 浦口区 NULL  
  11. 南京信息工程大学 浦口区 NULL  
  12. 金陵学院 浦口区 NULL  

[MSSQL]SQL 关于使用CTE(公用表表达式)的递归查询 关于使用CTE(公用表表达式)的递归查询----SQL Server 2005及以上版本   公用表表达式 (CTE) 具有一个重要的优点,那就是能够引用其自身,从而创建递归 CTE。递归 CTE 是一个重复执行初始 CTE 以返回数据子集直到获取完整结果集的公用表表达式。   当某个查询引用递归 CTE 时,它即被称为递归查询。递归查询通常用于返回分层数据,例如:显示某个组织图中的雇员或物料 阅读详情

相关推荐

sqlserver中的递归

sqlserver递归查询树结构的表的根结点子最里层的子结点

SQLServer CTE 递归查询

一、递归查询 1.结构: 递归CTE最少包含两个查询(也被称为成员)。   第一个查询为定点成员,定点成员只是一个返回有效表的查询,用于递归的基础或定位点。   第二个查询被称为递归成员,使该查询称为递归成员的是对CTE名称的递归引用是触发。在逻辑上可以将CTE名称的内部应用理解为前一个查询的结果集。 2.递归结束条件:   第二个递归查询返回空结果集或是超出了递归次数的最大限制时才停止递归。 3.Sql递归的优点:   效率高,大量数据集下,速度比程序的查询快。 4.递归查询的作用:   用来查询指定成员

小道的博客 5027

使用SqlServer CTE递归查询处理树、图和层次结构

递归CTE是SQL SERVER 2005中重要的增强之一。一般我们在处理树,图和层次结构的问题时需要用到递归查询。本文给大家详解使用sqlserver cte递归查询出来树、图和层次结构,本文介绍的非常详细,感兴趣的朋友一起看看吧

SQL Server CTE 递归查询全解

在TSQL脚本中,也能实现递归查询,SQL Server提供CTE(CommonTableExpression),只需要编写少量的代码,就能实现递归查询,本文详细介绍CTE递归调用的特性和使用示例,递归查询主要用于层次结构的查询,从叶级(Leaf Level)向顶层(Root Level)查询,或从顶层向叶级查询,或递归的路径(Path)。 一,递归查询原理 CTE的递归查询必...

a572893208的博客 1705

大疆上云API-1.10.0版本-设备位置数据实时处理与WebSocket推送实战解析

本文深入解析了大疆上云API 1.10.0版本中设备位置数据的实时处理与推送全链路。通过剖析源码,详细阐述了从MQTT接收OSD数据、Spring Integration路由分发、业务逻辑处理到WebSocket实时推送至前端地图的核心流程,并提供了实战优化与避坑指南,帮助开发者构建高可靠的无人机实时定位系统。

weixin_29291863的博客 413

BSD盲区检测系统性能要求及试验方法

盲区监测系统BSD通过安装在车辆后方的两颗毫米波雷达实时监测驾驶员视野盲区,当发现视野盲区内出现其它道路使用者时,通过左右后视镜上的警示灯向驾驶员发出报警。

未知艺术家的博客 2359

SQL Server 2005中的CTE递归查询得到一棵树

今天基本搞清楚SQL Server中递归查询的实现方式,So,先记录下来。不过呢,个人觉得SQL Server的递归查询相对于Oracle中的递归查询更加难以理解。 从SQL Server 2005开始,我们可以直接通过CTE来支持递归查询,这对查询树形或层次结构的数据很有用。CTE即公用表表达式,虽然不恰当,但你可以将它看做成一个临时命名的结果集合。 我们先建立一个示例表,名称为MENU,表示菜单的层次结构:显示行号复制代码?SQL CREATE TABLE MENU  (name nvarchar(50

Mr 斌 的专栏 1万+

HexView 脚本自动化工具:从刷写文件处理到批量转换实战

本文详细介绍了如何利用HexView脚本自动化工具高效处理嵌入式刷写文件。通过实战演示,文章展示了如何使用bat脚本实现S19、HEX等格式文件的剪切、填充、合并与批量转换,构建自动化流水线,从而显著提升汽车电子等领域的开发与生产效率。

weixin_29237635的博客 356

SqlServer:CTE函数处理递归(WITH语法)

我们在做分类处理的时候,总会遇到递归的处理,比如说地区就是一个例子,中国--北京--西城区,我们可以把这样的信息存储在一个数据表中,用ParentID区分根节点和叶子节点。假如我们要做导航,得到了”西城区”,但是还要得到他的父级,或夫父级,一种方式是用程序来处理,也是很简单,另一种方式就是用数据库的功能。既然数据库能完成这件事,何必在用程序呢? 在SqlServer...

weixin_30802273的博客 265

Java8动态生成SFunction:基于字段名的Lambda表达式实践

本文深入探讨了在Java8中如何基于字段名动态生成SFunction,以解决MyBatis Plus的LambdaQueryWrapper在动态查询场景下的局限性。通过核心原理LambdaMetafactory的解析和手把手的代码实现,展示了如何将字符串字段名转换为类型安全的Lambda表达式,从而实现真正动态、类型安全的查询条件构建与通用数据处理,显著提升代码的灵活性与安全性。

sss66的博客 953

通义千问对接FreeSWITCH实现大模型呼叫中心

通义千问是由阿里云开发的大规模语言模型,具备优秀的自然语言处理能力,支持文本生成、问答对话、摘要提取等多种任务。它不仅拥有丰富的知识储备,还能根据上下文灵活调整回答策略,适用于各种复杂场景下的自动化交流。FreeSWITCH是一个开源的多媒体通信服务器,提供了包括VoIP通话、即时消息传递在内的多种通信服务。它的模块化设计允许开发者根据实际需求定制功能,广泛应用于企业级通信系统中。通过集成通义千问,FreeSWITCH能够实现更智能的客户服务体验。

技术永不眠 Q:53195017 1499

mysql cte递归_SQLSERVER中CTE语句结构及CTE递归查询

SQL SERVER中CTE语句结构及CTE递归查询 CTE语句结构 公用表表达式 (CTE) 可以认为是在单个 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 语句的执行范围内定义的临时结果集。CTE 与派生表类似,具体表现在不存储为对象,并且只在查询期间有效。与派生表的SQL SERVER中CTE语句结构及CTE递归查询CTE语句结构公用表表达式 (CTE)...

weixin_39863631的博客 322

HFSS实战项目——微带带通滤波器设计

本文详细介绍并设计了一款微带带通滤波器,通过HFSS三位电磁仿真软件对其进行仿真设计及优化,仿真结果表明,本文设计的滤波器表现出优良的滤波性能,符合设计要求。

2401_87464239的博客 5393

mssql sqlserver with cte表达式(递归)找出最顶值的方法分享

mssql sqlserver with cte表达式(递归)找出最顶值的方法分享 原文:mssql sqlserver with cte表达式(递归)找出最顶值的方法分享 摘要: 下文通过递归的方式找出最顶级部门的方法分享,如下所示: 实验环境:sql server 2008 R2 下文通过cte-with表达式实现递归,获取一个公司...

weixin_30412167的博客 360

QT实现MQTT服务端(附完整源码)

QT实现MQTT服务端(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1253

Android 系统状态栏中实现高斯模糊背景

至此,我们已经完成了在 Android 系统的 SystemUI 中实现高斯模糊背景的过程。通过以上的布局和代码修改,我们可以在状态栏中看到具有高斯模糊效果的背景。同时,为了在不同版本的 Android 系统上适配高斯模糊效果,可能需要进行一些额外的代码调整和兼容性处理。希望本文能够帮助你理解如何在 Android 系统的 SystemUI 中实现高斯模糊背景,并通过提供的源代码进行相应的开发和调试。首先,我们需要在 SystemUI 的布局文件中添加一个用于展示高斯模糊背景的视图。属性来开启模糊效果。

CyberSparkZ的博客 871

SQL Server CTE 递归查询全解(转载)

在TSQL脚本中,也能实现递归查询,SQL Server提供CTE(Common Table Expression),只需要编写少量的代码,就能实现递归查询,本文详细介绍CTE递归调用的特性和使用示例,递归查询主要用于层次结构的查询,从叶级(Leaf Level)向顶层(Root Level)查询,或从顶层向叶级查询,或递归的路径(Path)。 一,递归查询原理 CTE的递...

254

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

SqlServer 实现CTE(递归)查询

寻找良久,终于实现,记个笔记: --SqlServer 2005 CTE with cte (deptid,dptname,parentid) as ( --起始条件 select a.deptid,a.dptname,a.parentid from base_dept a where a.deptid = 2 union all --CTE每次递归条件 select a.dep...

178

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

SQL Server 中的 CTE 递归查询

从SQL Server 2005开始,我们可以直接通过CTE来支持递归查询,这对查询树形或层次结构的数据很有用。CTE——你可以将它看做成一个临时的结果集合。      我们先建立一个示例表,名称为MENU,表示菜单的层次结构:   CREATE TABLE MENU   (     name nvarchar(50) NOT NULL PRIMARY KEY,     se

macavalier的专栏 2317

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Sql Server 使用CTE实现递归查询

<br /><br />递归CTE是SQL SERVER 2005中重要的增强之一。一般我们在处理树,图和层次结构的问题时需要用到递归查询。<br />  CTE的语法如下<br /> 1 WITH CTE AS<br />2 (<br />3     SELECT EmpId, ReportTo, FName FROM Employ WHERE EmpId=1<br />4     UNION ALL<br />5     SELECT emp.EmpId, emp.ReportTo, emp.FName

老任物联网杂谈的专栏 588

SQL Server中的CTE递归查询

今天基本搞清楚SQL Server中递归查询的实现方式,So,先记录下来。不过呢,个人觉得SQL Server的递归查询相对于Oracle中的递归查询更加难以理解。  从SQL Server 2005开始,我们可以直接通过CTE来支持递归查询,这对查询树形或层次结构的数据很有用。CTE即公用表表达式,虽然不恰当,但你可以将它看做成一个临时命名的结果集合。  我们先建立一个示例表,名称为MENU

xiongxyt2的专栏 829

妙用CTE,一条语句实现sql递归查询,SQLServer 递归

数据库设计中经常碰到父子节点的关系结构,经常需要找到某个节点的根,或者某个节点的所有子节点,一般做法都是在业务层做递归的方式实现,或者数据库存储过程实现。但其实SQLServer提供的CTE可以很好的简化我们的工作,非常方便的实现这一功能。例子:  1.正向递归,找某个节点下的所有子节点 with t as--如果CTE前面有语句,需要用分号隔断(selectId,ParentId,Name...

weixin_34268169的博客 309

SQL Server 2008中的CTE递归查询

<br /><br /><br />今天基本搞清楚SQL Server中递归查询的实现方式,So,先记录下来。不过呢,个人觉得SQL Server的递归查询相对于Oracle中的递归查询更加难以理解。 <br />从SQL Server 2005开始,我们可以直接通过CTE来支持递归查询,这对查询树形或层次结构的数据很有用。CTE即公用表表达式,虽然不恰当,但你可以将它看做成一个临时命名的结果集合。 <br />我们先建立一个示例表,名称为MENU,表示菜单的层次结构:<br />显示行号 复制代码 ? <

FANET 979
上一篇: String和StringBuild区别
下一篇: Word字体的字号与像素对应关系
庆涛1992
博客等级 码龄9年 37粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值