对SQL CTE的一点个人理解
/*
执行顺序:
首先,执行按一、二,此时二输出的结果,可以理解为临时n
然后,按三、二、三、二循环执行
注意:
,步骤三的where为递归终止条件,由于用的是substr函数。在最后一次递归的时候,如果不加限制,给的substr的起始位置会大于字符串长度导致报错
,步骤三的from为CTE临时表,在开始递归的时候,需要动态获取循环截断的三个条件。
,关键字 union all 下面为每次递归的语句,递归数据集必为CTE的临时表n
*/
1 WITH n --下面括号内的为递归用的参数
2 ( str --需要分割的字符串
3 , ori --截断的位置,随每次递归增加
4 , pos --下一次substr截取到的位置,
5 )
6 AS
7 (
8 ---------执行步骤一 ------------------------
9 select dept_lid as str
10 ,1
11 ,locate(',',dept_lid)
12 from pacs.PACSIE_USER_TBL a where user_id='11077'
13 union all
14 ---------执行步骤三 ------------------------
15 select str
16 ,pos + 1
17 ,locate(',',str,pos+1)
18 from n
19 WHERE locate (',', str, pos + 1) > 0
20 )
21 ---------执行步骤二 ------------------------
22 SELECT substr (str, ori, pos - ori) AS RESULT
23 FROM n
-----------------------实质就是将步骤一的结果,循环带入步骤三执行。步骤二只做每次递归后的输出用途。
--执行逻辑如下
引用:https://www.cnblogs.com/heyu/articles/11324767.html
1 SELECT c.CategoryId,c.Name,c.Parent,tt.level+1 level FROM Category c JOIN
2 (
3 SELECT c.CategoryId,c.Name,c.Parent,tt.level+1 level FROM Category c JOIN
4 (
5 SELECT c.CategoryId,c.Name,c.Parent,tt.level+1 level FROM Category c JOIN
6 (
7 SELECT CategoryId,Name,Parent,0 level FROM dbo.Category WHERE CategoryId=46
8
9 )tt ON tt.Parent=c.CategoryId
10 )tt ON tt.Parent=c.CategoryId
11 )tt ON tt.Parent=c.CategoryId
其他的
递归后的结果,需要再生成一个临时表与其他表进行关联使用。
1 WITH n (...)
2 AS
3 (--递归
4 )
5 ,m as (
6 SELECT substr (str, ori, pos - ori) AS RESULT
7 FROM n
8 )
9 select *
10 from m a
11 join b on a.result=b.dept_lid
对SQL CTE的一点个人理解的更多相关文章
- net core体系-web应用程序-4net core2.0大白话带你入门-8asp.net core 内置DI容器(DependencyInjection,控制翻转)的一点小理解
asp.net core 内置DI容器的一点小理解 DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IO ...
- AngularJS』一点小小的理解
『AngularJS』一点小小的理解 AngularJS 是一个前端的以Javascript为主的MVC框架.与AngularJS相类似的还有EmberJS. 随着时代在进步,各种各样的开发理念与 ...
- sql主键的一点重要理解
sql只会读取数据,不会自动设置主键,所以绑定数据后要设置主键(前台) 不管是int或者uniqueidentifier只要类型对得上就可以用,int自增其实没什么太大优势(但是通常都会用自增来做,从 ...
- Sql — CTE公用表表达式和With用法总结
CTE(Common Table Expression) 公用表表达式,它是在单个语句的执行范围内定义的临时结果集,只在查询期间有效.它可以自引用,也可在同一查询中多次引用,实现了代码段的重复利用. ...
- SQL Server执行计划的理解【转】
要理解执行计划,怎么也得先理解,那各种各样的名词吧.鉴于自己还不是很了解.本文打算作为只写懂的,不懂的懂了才写. 在开头要先说明,第一次看执行计划要注意,SQL Server的执行计划是从右向左看 ...
- SQL SERVER中架构的理解
在sqlserver 2005中,可能大家在工作或学习的时候会经常发现这样一些问题,你使用一个账户在数据库中创建了一张表,却发现你自己创建的表却没有修改和查询的权限,这是一件很郁闷的事情,在sqlse ...
- Layui的一点小理解(上)
首先声明这是个人的一点理解,如有不对之处请指正,以下的例子有在官网上看到的,有的是自己写的.还是老规矩最后会附上官网的,如有不明白之处,请查看文档或留言. 既然说Layui,当然要简单的介绍以下什么是 ...
- SQL Server“复杂”概念之理解
用惯了Oracle的人,接触SQL Server中的概念时,会觉得比较难理解,甚至感觉有点“绕”,这是因为Oracle中将某些其他数据库中存在的概念给简化了,这里就拿两个最常见的概念来举例说明:1.s ...
- 一条sql语句搞定基于mysql的sql执行顺序的基本理解
对数据库基本操作是每个程序员基本功,如何理解并快速记住sql执行的顺序呢,其实一条复杂的sql就能搞定: SELECT DISTINCT <select_list> FROM <le ...
- SQL Server 执行计划的理解
要理解执行计划,怎么也得先理解,那各种各样的名词吧.鉴于自己还不是很了解.本文打算作为只写懂的,不懂的懂了才写. 在开头要先说明,第一次看执行计划要注意,SQL Server的执行计划是从右向左看的. ...
随机推荐
- Linux备份服务
备份服务 一.备份服务概述 备份服务:需要使用脚本,打包备份,定时任务 通过rsyncd服务,不同主机之间进行数据传输 rsyncd特点: rsync是个服务,也是命令 使用方便,有多种模式 传输数据 ...
- 12月14日内容总结——模板层之标签、自定义模板语法、母版(模版)的继承与导入、模型层前期准备知识点、ORM常用关键字
目录 一.模板层之标签 分支结构if for循环 with(定义变量名) 二.自定义过滤器.标签及inclusion_tag(了解) 三.母版(模板)的继承与导入(重要) 四.模型层之前期准备 模型层 ...
- 普冉PY32系列(五) 使用JLink RTT代替串口输出日志
目录 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境 普冉PY32系列(三) P ...
- Vue32 插槽
1 简介 是一种组件间通信的方式,让父组件可以向子组件指定位置插入 html 结构.子组件中的提供给父组件使用的一个占位标签,用<slot></slot> 表示,父组件可以在这 ...
- Jetpack Compose学习(10)——使用Compose物料清单BOM,更好管理依赖版本
原文地址:Jetpack Compose学习(10)--使用Compose物料清单BOM,更好管理依赖版本 - Stars-One的杂货小窝 本期讲解下关于Android推出的BOM来简化我们添加co ...
- 新一代自动化利器-DrissionPage
熟悉的小伙伴知道我的工作有相当一部分是自动化,在探索相关的技术上一直没停下脚步,我痛恨selenium.playwright的非标准内核机制,也曾对clicknium引进了新的问题无语,以及接口爬取数 ...
- RA维持期达标式减停生物制剂(DRESS研究)的18个月数据
标签:类风湿关节炎; TNF抑制剂; 达标式减停药物 RA维持期达标式减停生物制剂(DRESS研究): 18个月临床疗效与继续足量应用者相仿 电邮发布日期: 2016-01-14 由于缺乏对常规诊疗有 ...
- 开发者进阶必备的9个Tips & Tricks!
优秀的开发人员市场前景是十分广阔的,但想找到一份理想的工作,仅有代码知识是不够的.优秀的工程师应该是一个终身学习者.问题的创造性解决者,着迷于整个软件世界.要成为一名优秀的开发者,应该具备哪些品质并做 ...
- 9.增加Marker 标记
1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta charset="U ...
- 周练3(php反序列化)
serialize()函数 $s = serialize($变量); //该函数将变量数据进行序列化转换为字符串 file_put_contents('./目标文本文件', $s); //将$s保存到 ...