理解 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中函数的主体是在局部作用域中执行的,该作用域不同于全局作用域.这个新的作用域是通过将调用对象添加到作用域链的头部而创建的(没怎么理解这句话,有理解的亲可以留 ...
随机推荐
- [转]windows环境下使用virtualenv对python进行多版本隔离
windows环境下使用virtualenv对python进行多版本隔离 最近在用python做一个文本的情感分析的项目,用到tensorflow,需要用python3的版本,之前因为<机器学习 ...
- 获取 TUniConnection.SpecificOptions默认值和下拉框列表值
TUniConnection的SpecificOptions参数决定了数据库连接配置参数,但可惜的是,SpecificOptions设计器界面,Devart公司只能让它在设计期配置! Specific ...
- 构建Jenkins自动化编译管理环境
今天研究了一下Jenkins,有了一个粗浅的认识,顺手把构建的过程说一下,后续慢慢补充: (1)Secure CRT 连接到Linux服务器 要注意的一点是,要搞好一个文件传输的路子,否则不好传东西. ...
- linux找不到动态链接库 .so文件的解决方法
linux找不到动态链接库 .so文件的解决方法 如果使用自己手动生成的动态链接库.so文件,但是这个.so文件,没有加入库文件搜索路劲中,程序运行时可能会出现找不到动态链接库的情形. 可以通过ldd ...
- node.js 学习的一个链接
Node.js简介 点击查看 狼叔 的
- 关于JSON 与 对象 、集合 之间的转换
在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML.JSON等,JSON作为一个轻量级的数据格式比xml效率要高,XML需要很多的标签,这无疑占据了网络流量,JSON在这方面则做的很好, ...
- PREV-6_蓝桥杯_翻硬币
问题描述 小明正在玩一个“翻硬币”的游戏. 桌上放着排成一排的若干硬币.我们用 * 表示正面,用 o 表示反面(是小写字母,不是零). 比如,可能情形是:**oo***oooo 如果同时翻转左边的两个 ...
- 【Mysql】事务日志-Write Ahead logging vs command-logging(转)
原理讲解: Write Ahead logging vs command logging Write Ahead logging 持久化数据保存在磁盘,数据的存储是随机的,并非顺序: 内存中保存磁盘数 ...
- Ubuntu 14.10 下Eclipse操作HBase
环境介绍 64位Ubuntu14.10,Hadoop 2.5.0 ,HBase 0.99.0 准备环境 1 安装Hadoop 2.5.0,可参考http://www.cnblogs.com/liuch ...
- mac brew 安装 nginx fpm mysql 教程
一. 安装brew 要求:OS X 10.6以上系统,并且安装有XCode命令行工具 对于10.11的系统需要设置下local的权限为当前用户 $ sudo chown -R $(whoami):ad ...