DML增强功能-CTE(1)

1.CTE的通用形式

  WITH temp_name as

  (

    CTE查询结果集

  )

with/as :关键字

temp_name:为CTE临时使用名称,可以看初学者做是一个临时表

():查询结果集主体

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(‘20181201‘ 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

结果如图:

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,这个不演示了,有意者可以自己去。

原文地址:https://www.cnblogs.com/gered/p/9093898.html

时间: 2024-10-25 08:36:29

DML增强功能-CTE(1)的相关文章

(2)DML增强功能-4大排名函数与top ties

1.row_number()  over( partition by column order by column) (1)测试数据 (2)根据程序使用row_number() over()排序 (3)说明:即使相同分数,也会按排序(这里用到的是默认聚集索引(id字段)排序) (4)至于row_number()  over(partition by column order by column) 加上分区的这种,这里就不演示了,(1-3)中演示的是以所有数据为整体排序,如果用上partition

(5)DML增强功能-try catch及事务控制

一.事务控制与Try Catch结合 BEGIN TRY BEGIN TRAN; DECLARE @aaa NVARCHAR(MAX); SET @aaa = 9 / 0; COMMIT TRAN; END TRY BEGIN CATCH --[错误]-- DECLARE @ErrorMessage NVARCHAR(MAX) , @ErrorSeverity INT , @ErrorState INT , @exception NVARCHAR(255); SELECT @ErrorMessa

12c分区增强功能,新功能(文档ID 1568010.1)

12c Partitioning Enhancements, New Features (Doc ID 1568010.1) APPLIES TO: Oracle Database - Enterprise Edition - Version 12.1.0.1 and laterOracle Database Cloud Schema Service - Version N/A and laterOracle Database Exadata Express Cloud Service - Ve

virtualbox虚拟机kali增强功能安装

添加更新源 leafpad /etc/apt/sources.list 阿里塬 deb http://mirrors.aliyun.com/kali sana main non-free contrib deb http://mirrors.aliyun.com/kali-security/ sana/updates main contrib non-free deb-src http://mirrors.aliyun.com/kali-security/ sana/updates main c

虚拟机下安装centos提醒增强功能

在VirtualBox虚拟机中安装了Centos系统,安装增强功能时报错,错误为"centos the headers for the current running kernel were not found......",报错原因是系统找不到kernel headers,在网上找到了方法,原解决方案为: 1)yum install gcc  -y 2)yum install gcc kernel-devel kernel-headers -y 3)重启系统 但在执行上述步骤并重启系

virtualbox安装增强功能(centos6.5)

vitualbox安装增强功能(centos 6.5) 1. 安装依赖包 #yum install kernel-headers-$(uname -r) #yum install kernel-devel-$(uname -r) #yum install gcc* 如果上述内核开发包安装失败,则根据自己系统内核版本下载的相应的rpm包: 下载链接: http://rpmfind.net/ http://rpm.pbone.net/ (例如, centos6.5) rpm -ivh kernel-

【转】virtualbox 4.08安装虚机Ubuntu11.04增强功能失败解决方法

原文网址:http://fuliang.iteye.com/blog/1102998 在笔记本安装Ubuntu11.04增强功能失败 引用 [email protected]:~$ sudo /etc/init.d/vboxadd setup Removing existing VirtualBox DKMS kernel modules ...done. Removing existing VirtualBox non-DKMS kernel modules ...done. Building

Linux # Virtul Box 安装增强功能时, 未能加载虚拟光盘VBoxGuestAdditions.iso

问题: Virtul Box 安装增强功能时, 未能加载虚拟光盘VBoxGuestAdditions.iso 分析:通过分析日志,%vbox_path%\VirtualBox Guest Additions\install_drivers.log发现, 查看安装过程中的信息,如下图,发现缺少 相关dll文件, Linux # Virtul Box 安装增强功能时, 未能加载虚拟光盘VBoxGuestAdditions.iso,布布扣,bubuko.com Linux # Virtul Box 安

virtualbox linux客户机中安装增强功能包缺少kernel头文件问题解决

linux客户机中安装增强功能包总会提示缺少kernel头文件 根据发行版的不同,用命令行软件包管理命令安装dkms build-essential linux-headers-$(uname -r),我的客户机是openSUSE,所以命令如下: zypper install dkms build-essential linux-headers-$(uname -r) 然后,再用root身份安装光盘中的vboxaddition.run,安装完成后,重启客户机即可.