(1.1)DML增强功能-CTE
关键字:SQL树查询(参考:树遍历)
1.CTE的通用形式
WITH temp_name as
(
CTE查询结果集
)
释义:
(1)with/as :关键字
(2)temp_name:为CTE临时使用名称,可以看初学者做是一个临时表
(3)():查询结果集主体
2.CTE的递归查询
介绍:其实CTE最强大的地方就是在于其递归查询
举例1:使用CTE递归获取某年的1-12月份
--获取2018年的1-12月份(可以用来做外连接和分组)
;with date_test as
(
select cast('20180101 00:00:00' as datetime) as 'date'
union all
select dateadd(mm,1,cast([date] as datetime)) as 'date' from date_test
where [date] < cast('' as datetime)
)
select date date from date_test
--select convert(char(7),date,120) date from date_test 获取其年号与月号
执行结果如图:

举例2:递归快速构建1~100(再大也可以用这个办法快速构建)
with t
as
(select 1 as dt
union all
select dt+1 from t
where dt+1<=100
)
select dt from t -- option(maxrecursion 0)
;
结果如图:篇幅太长看下面的行数即可

举例3:经典树形结构查询
IF OBJECT_ID('TEST106') IS NOT NULL
BEGIN
drop table test106
END
--建表
create table test106(
id int,
name varchar(20),
parent int,
description varchar(20)
)
--建造数据
insert into test106 values
(1,'A',0,'总经理'),
(2,'B',1,'开发部经理'),
(3,'C',2,'JAVA小组长'),
(4,'guo',3,'苦逼的开发'),
(5,'li',3,'苦逼的开发'),
(6,'zhao',3,'安静的测试'),
(7,'wang',3,'暴躁的测试'),
(8,'D',2,'JAVA测试小组长')
--1.从上往下查,我要查开发部经理B下的所有下属
--2.从下往上查也一样(只是稍作修改),这里就不作演示了
with tree_test(id,name,parent,description) as
(
select id,name,parent,description from test106
where id=2
union all
select t1.id,t1.name,t1.parent,t1.description from test106 t1 join tree_test t2 on t1.parent = t2.id --这里不做表关联用exists也是不错的选择
)
select * from tree_test
结果如图:

举例4:CTE实现instr功能
if object_id('tempdb..#T') is not null
drop table #T
create table #T
(
source_string nvarchar(4000)
)
insert into #T values (N'我们我们')
insert into #T values (N'我我哦我')
declare @sub_string nvarchar(1024)
declare @nth int
set @sub_string = N'我们'
set @nth = 2
;with T(source_string, starts, pos, nth)
as (
select source_string, 1, charindex(@sub_string, source_string), 1 from #t
union all
select source_string, pos + 1, charindex(@sub_string, source_string, pos + 1), nth+1 from T
where pos > 0
)
select
source_string, pos, nth
from T
where pos <> 0
and nth = @nth
order by source_string, starts
--source_string pos nth
--我们我们 3 2

检索字符改成我,试试。

3.CTE的CUR(R上面1-2已经描述过了,这里不再赘述)
这里使用2中的例3中的数据
insert into test106 values
(1,'A',0,'总经理'),
(2,'B',1,'开发部经理'),
(3,'C',2,'JAVA小组长'),
(4,'guo',3,'苦逼的开发'),
(5,'li',3,'苦逼的开发'),
(6,'zhao',3,'安静的测试'),
(7,'wang',3,'暴躁的测试'),
(8,'D',2,'JAVA测试小组长')
(1)delete示例
select * from test106
--用CTE筛选出id<=3的数据
;with temp_delete as
(
select * from test106
where id <=3
)
delete from temp_delete
select * from test106;
结果如下:

(2)update
与(1)一样没什么区别
做好with temp_name as ()之后,直接就update语句from temp_name 即可,这里不再演示。
(3)insert
同(1)、(2),直接insert into select temp_name即可
4.CTE的总结与分析
(1)递归CTE的执行过程

(2)CTE的注意事项
【1】在cte使用之前如果有有语句运行,必须加';'分号,如3中的delete示例中一样。否则可以不加。

【2】在cte中可以定义多个temp_name,但不可重复,只能后者调用先定义的

【3】CTE只在定以后第一条语句使用,并且可以重复在第一条语句使用其temp_name表

【4】CTE定义好后,使用的时候temp_name如果和现有表同名,则CTE下第一条语句使用的是temp_name表

【5】同一个CTE定义过程中不可有同名的temp_name

【6】CTE中不可嵌套CTE,这个不演示了,有意者可以自己去。
(1.1)DML增强功能-CTE的更多相关文章
- (1.3)DML增强功能-Apply、pivot、unpivot、for xml path行列转换
深入了解行列转换请参考另一篇文章:https://www.cnblogs.com/gered/p/9271581.html 总结: 1.apply一般形式 --基本形式 SELECT a FROM d ...
- (1.5)DML增强功能-try catch及事务控制
一.事务控制与Try Catch结合 当 SET XACT_ABORT 为 ON 时,如果执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚. 当 SET XACT_ABORT ...
- (1.4)DML增强功能-Output
Output在CRUD的区别 1.对于INSERT,可以引用inserted表以查询新行的属性.在insert into table output . 2.对于DELETE,可以引用deleted表以 ...
- (1.2)DML增强功能-4大排名函数与top ties/tablesample
关键字:sql server窗口函数.分析函数.四大窗口函数 1.row_number() over( partition by column order by column) (1)测试数据 (2 ...
- 12c分区增强功能,新功能(文档ID 1568010.1)
12c Partitioning Enhancements, New Features (Doc ID 1568010.1) APPLIES TO: Oracle Database - Enterpr ...
- virtualbox安装增强功能时【未能加载虚拟光盘】
virtualbox安装增强功能时[未能加载虚拟光盘] 今天在使用Virtualbox中的Ubuntu虚拟机,想安装增强功能来实现更改分辨率,但是在安装时出错:未能加载虚拟光驱 VBoxsGuestA ...
- virtualbox安装增强功能(centos6.5)
vitualbox安装增强功能(centos 6.5) 1. 安装依赖包 #yum install kernel-headers-$(uname -r) #yum install kernel-dev ...
- VirtualBox-Linux系统安装增强功能
我们在安装之前,必须得先安装好它所需要的依赖包,不然安装过程必定会出现错误! 一.安装依赖包 #yum install kernel-headers #yum install kernel-devel ...
- 安装Virtual Box增强功能 - Ubuntu
一.开发环境 操作系统:Windows 7Virtual Box 版本: 5.0.10 虚拟机系统: Ubuntu 12.04 LTS 二.问题 进入Ubuntu图形界面后,选择“设备” --> ...
随机推荐
- db2
关于3种导入导出操作进行简单的介绍:export:导出数据,支持IXF,DEL或WSFimport:导入数据,可以向表中导入数据,支持上面提到的4种文件类型. load:导入数据,功能和impo ...
- 使用 JMeter 完成常用的压力测试 [转]
讲到测试,人们脑海中首先浮现的就是针对软件正确性的测试,即常说的功能测试.但是软件仅仅只是功能正确是不够的.在实际开发中,还有其它的非功能因素也起着决定性的因素,例如软件的响应速度.影响软件响应速度的 ...
- delphi7中添加QuickRep
具体的方法是: delphi主菜单的Project|Options命令, 在Package选项卡的Desing packages列表中如果可以看到QuickReport Components选项, 那 ...
- 51地图标注接口(EZMarker API)
功能 在很多时候,您需要您的用户标出一个位置,比如:一个房地产网站,用户在登记新楼盘的时候,就需要在地图上标出这个楼盘的位置,这个时候就可以用到本接口. 地图标注接口(EZMarker API)是我要 ...
- linux环境,crontab报错Authentication token is no longer valid; new one required You (aimonitor) are not allowed to access to (crontab) because of pam configuration.
问题描述: 今天同事反应,一个系统上的某些数据没有生成,看了下,怀疑定时任务没有执行,就看下了crontab,发现报了下面的错误: [aimonitor@4A-LF-w08 ~]$ crontab - ...
- oracle_存储过程_没有参数_根据配置自动创建申请单以及写日志事务回滚
CREATE OR REPLACE PROCEDURE A_MEAS_MIINSP_PLAN_CREATEASvs_msg VARCHAR2(4000);p_PERIODTYPE number; -- ...
- swift学习笔记之控制流
控制流: 1.if语句 let count = { print("yes") }else{ print("no") } 2.switch语句 (1)Swift中 ...
- ZooKeeper(四)-- 第三方客户端 ZkClient的使用
前言 zkClient主要做了两件事情: 一件是在session loss和session expire时自动创建新的ZooKeeper实例进行重连. 另一件是将一次性watcher包装为持久watc ...
- C++说明符和限定符
有些被称为存储说明符(storage class specifier)或cv-限定符(cv-qualifier)的C++关键字提供了一些有关存储的信息.下面是存储所说明符:* auto (在C++11 ...
- jquery获取父级元素、子级元素、兄弟元素的方法
jQuery.parent(expr) 找父亲节点,可以传入expr进行过滤,比如$("span").parent()或者$("span").parent(&q ...