理解 with递归调用 Sqlserver 树查询
--with用法
--可以这么理解 with SQL语句变量或者叫临时表名 as(
SQL语句
)
select * from SQL语句变量或者叫临时表名
--递归调用
with CTE as(
select ZTBM_ID,ztbm_name,ParentId from TB_ZYM_ZTBM where ParentId is null or ParentId=''
union all
select a.ZTBM_ID,a.ztbm_name,a.ParentId from TB_ZYM_ZTBM a inner join CTE on a.ParentId=CTE.ZTBM_ID
)
select * from CTE
--此语句可以理解如下
--同上一个语句
--最顶层 1
select ZTBM_ID,ztbm_name,ParentId from TB_ZYM_ZTBM where ParentId is null or ParentId=''
union all
select a.ZTBM_ID,a.ztbm_name,a.ParentId from TB_ZYM_ZTBM a
inner join --此处括弧可以理解为最顶层的CTE 此处红色CTE即上一个SQL语句的CTE
(
--第二层
select ZTBM_ID,ztbm_name,ParentId from TB_ZYM_ZTBM where ParentId is null or ParentId=''
union all
select a.ZTBM_ID,a.ztbm_name,a.ParentId from TB_ZYM_ZTBM a
inner join --此处括弧可以理解为第二层的CTE
(
--第三层
select ZTBM_ID,ztbm_name,ParentId from TB_ZYM_ZTBM where ParentId is null or ParentId=''
union all
select a.ZTBM_ID,a.ztbm_name,a.ParentId from TB_ZYM_ZTBM a
inner join
(
--第四层
select ZTBM_ID,ztbm_name,ParentId from TB_ZYM_ZTBM where ParentId is null or ParentId=''
union all
select a.ZTBM_ID,a.ztbm_name,a.ParentId from TB_ZYM_ZTBM a
inner join
(
select ZTBM_ID,ztbm_name,ParentId from TB_ZYM_ZTBM where ParentId is null or ParentId=''
--inner join.... 层层嵌套
--最底层
)
CTE on a.ParentId=CTE.ZTBM_ID
)
CTE on a.ParentId=CTE.ZTBM_ID )
CTE on a.ParentId=CTE.ZTBM_ID
)
CTE on a.ParentId=CTE.ZTBM_ID
变异如下查询(排序,及分割)
with CTE as
(
-->Begin 一个定位点成员
select ZTBM_ID, ztbm_name,ParentId,cast(ztbm_name as nvarchar(max)) as TE,
ROW_NUMBER()over(order by getdate()) as OrderID,0 as Levle
from TB_ZYM_ZTBM where deleteMark=1 and (ParentId is null or ParentId='')
-->End
union all
-->Begin一个递归成员
select TB_ZYM_ZTBM.ZTBM_ID, TB_ZYM_ZTBM.ztbm_name,TB_ZYM_ZTBM.ParentId,cast(replicate(' ',Levle+1)+'|_'+TB_ZYM_ZTBM.ztbm_name as nvarchar(MAX)) as TE,
CTE.OrderID*100+ROW_NUMBER()over(Order by GETDATE()) as OrderID ,Levle+1 as Levle
from TB_ZYM_ZTBM inner join CTE
on TB_ZYM_ZTBM.ParentId=CTE.ZTBM_ID
-->End
)
select * from CTE
order by LTRIM(OrderID)
参考:http://blog.csdn.net/bin_520_yan/article/details/5998349
http://msdn.microsoft.com/zh-cn/library/ms175972(SQL.105).aspx
理解 with递归调用 Sqlserver 树查询的更多相关文章
- SQL SERVER树型数据处理时,函数递归调用问题,查询根节点,子节点函数
/* 标题:查询指定节点及其所有子节点的函数 作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开) 时间:2008-05-12 地点:广东深圳 */ ) , pid ) , name )) ' , n ...
- SQLServer树查询
感觉这个CTE递归查询蛮好用的,先举个例子: use City; go create table Tree ( ID int identity(1,1) primary key not null, N ...
- SQLServer 之 树查询
一.SqlServer树查询 1.使用公用表表达式(CTE) 很多人可能想要查询整个树形表关联的内容都会通过循环递归来查...事实上在微软在SQL2005或以上版本就能用别的语法进行查询,下面是示例. ...
- 使用Map辅助拼装树状结构,消除递归调用
目前菜单或其他树状结构在数据库中的存储,多数是以一个parentid作为关联字段,以一维形式存储.使用时全部查询出来,然后在内存中拼装成树状结构.现在主要涉及的是拼装方法的问题. 一般可以进行 递归调 ...
- lintcode---线段树查询||(区间元素个数)
对于一个数组,我们可以对其建立一棵 线段树, 每个结点存储一个额外的值 count 来代表这个结点所指代的数组区间内的元素个数. (数组中并不一定每个位置上都有元素) 实现一个 query 的方法,该 ...
- Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数
Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数 目录 Pycharm使用技巧(转载) Python第一天 ...
- C#函数式编程之递归调用
关于递归相信大家已经熟悉的不能再熟悉了,所以笔者在这里就不多费口舌,不懂的读者们可以在博客园中找到很多与之相关的博客.下面我们直接切入正题,开始介绍尾递归. 尾递归 普通递归和尾递归如果仅仅只是从代码 ...
- SQLServer分页查询存储过程
项目中用到的SQLServer分页查询存储过程. [存储过程] create PROCEDURE prcPageResult -- 获得某一页的数据 -- @currPage int = 1, ...
- JavaScript函数之实际参数对象(arguments) / callee属性 / caller属性 / 递归调用 / 获取函数名称的方法
函数的作用域:调用对象 JavaScript中函数的主体是在局部作用域中执行的,该作用域不同于全局作用域.这个新的作用域是通过将调用对象添加到作用域链的头部而创建的(没怎么理解这句话,有理解的亲可以留 ...
随机推荐
- 简单说说 Java 的 JVM 内存结构
问:简单说说 Java 的 JVM 内存结构分为哪几个部分? 答:JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分,分别解释如下.虚拟机栈:线程私有的,每个方法在执行时会创建一个 ...
- Python实战(6)单线程和多线程导入mysql数据对比测试
单线程脚本 导入文件的行数 # wc -l /data/logs/testlog/20120219/testlog1/* 1510503 total # -*- coding: utf-8 -*- # ...
- sql 数据类型转换
1.convert(float,endtimepart)——conver(数据类型,字段名称) 2.cast(endtimepart as float)——cast(字段名称 as 数据类型)
- 黄聪:超实用的PHPExcel[导入][导出]实现方法总结
首先需要去官网https://github.com/PHPOffice/PHPExcel/下载PHPExcel,下载后只需要Classes目录下的文件即可. 1.PHPExcel导出方法实现过程 /* ...
- adb命令模拟按键输入keycode
adb命令模拟按键输入keycode 2017年05月18日 14:57:32 阅读数:1883 例子: //这条命令相当于按了设备的Backkey键 adb shell input keyevent ...
- JIRA 资源
https://www.**.com/article/2015/8/7/22532.html e_v_g_e_t JIRA使用教程:在Windows上安装JIRAJIRA使用教程:在Linux上安装J ...
- ubuntu16.04下sublime text 3之安装和配置
1.安装方法 1)使用ppa安装 sudo add-apt-repository ppa:webupd8team/sublime-text-3 sudo apt-get update sudo apt ...
- HDOJ 2003 求绝对值
#include<cstdio> #include<cmath> int main() { double a; while (scanf_s("%lf", ...
- [UE4]使用材质将图片变成黑白
拖动到材质界面不放,会自动切换到材质界面: 拖放到视图窗口,放开鼠标,就会自动生成一个“Texture Sample”节点 图片材质使用方法跟直接使用图片素材一样:
- php安装imagemagick扩展 常见问题与解决方案(win平台)
1.写在前面 1-1.ImageMagick介绍 ImageMagick是一套功能强大.稳定而且开源的工具集和开发包,可以用来读.写和处理超过89种基本格式的图片文件,包括流行的TIFF.JPEG.G ...