转:CTE(公共表表达式)——WITH子句
来自:《Microsoft SQL Server 2008技术内幕:T-SQL语言基础》
一、公共表表达式(CTE,Common Table Expression)是在SQL Server 2005中引入的,是ANSI SQL标准的一部分。
CTE是用WITH定义的,它的一般格式为:
WITH <CTE_名称>[(目标列_列表)] WITH <CTE_Name>[(target_column_list)]
AS AS
( (
<定义CTE的内部查询> <innser_query_defining_CTE>
) )
<对CTE进行查询的外部查询>; <outer_query_against_CTE>;
如:
with XiaoMingInfo
as
(
select * from Student where Name='小明'
)
select * from XiaoMingInfo;
注:(来自:http://wudataoge.blog.163.com/blog/static/80073886200961652022389/)
1、如果CTE的名称(<CTE_Name>)与某个数据表或视图重名,则紧跟在该CTE后面的SQL语句使用的仍然是CTE,在这之后的SQL语句使用的则是数据表或视图了。如:
select Id,Name,BirthdayYear from XiaoMingInfo; with Person --是一个实际存在的表
as
(
select * from Student where Name='小明'
)
select * from Person --使用的是名为Person的CTE
select * from Person --使用的是名为Person的数据表
2、不能在<innser_query_defining_CTE>中使用以下语句:
(1)、COMPUTE或COMPUTE BY
(2)、ORDER BY(除非指定了TOP子句)
(3)、INTO
(4)、带有查询提示的 OPTION 子句
(5)、FOR XML
(6)、FOR BROWSE
二、分配列别名:
1、在内部使用as关键字
with XiaoMingInfo
as
(
select Id,Name,year(Birthday) as BirthdayYear from Student where Name='小明'
)
select Id,Name,BirthdayYear from XiaoMingInfo;
2、在CTE名称后面的一对圆括号中指定目标的列表
with XiaoMingInfo(Id,Name,BirthdayYear)
as
(
select Id,Name,year(Birthday) from Student where Name='小明'
)
select Id,Name,BirthdayYear from XiaoMingInfo;
三、使用参数
declare @stuName nvarchar(20)
set @stuName = '小明'; --CTE前一个语句必须以分号结尾
with XiaoMingInfo(Id,Name,BirthdayYear)
as
(
select Id,Name,year(Birthday) from Student where Name=@stuName
)
select Id,Name,BirthdayYear from XiaoMingInfo;
四、定义多个CTE
with PersonInfo
as
(
select * from Student where year(Birthday)=year(getdate())
),
XiaoMingInfo
as
(
select * from PersonInfo where Name='小明'
)
select * from XiaoMingInfo
五、递归CTE:CTE支持递归查询。定义一个递归CTE至少需要两个查询;第一个查询称为定位点成员,第二个查询称为递归成员。递归CTE的基本格式如下:
WITH <CTE_Name>[(target_column_list)]
AS
(
<anchor_member>
UNION ALL
<recursive_member>
)
<outer_query_against_CTE>;
定位点成员只是一个返回有效关系结果表的查询,与用于定义非递归表表达式的查询类似。定位点成员只被调用一次。递归成员是一个引用了CTE名称的查询。对CTE名称的引用代表的是在一个执行序列中逻辑上的“前一个结果集”。第一次调用递归成员时,“前一个结果集”代表有定位点成员返回的任何结果集。之后每次调用递归成员时,对CTE名称的引用代表对递归成员的前一次调用所返回的结果集。递归成员没有显式的递归终止检查(终止检查是隐式的)。递归成员会一直被重复调用,直到返回空结果集或超过某种限制条件。
在查询返回的结果上,两个成员查询必须在列的个数和相应列的数据类型上保持兼容。
外部查询中的CTE名称引用代表对定位点成员调用和所有对递归成员调用的联合结果集。
1、不将自己包括在内
2、将自己包括在内
转:CTE(公共表表达式)——WITH子句的更多相关文章
- sql中with的用法(CTE公用表表达式):应用子查询嵌套,提高sql性能
一.WITH AS的含义 WITH AS短语,也叫子查询部分(subquery factoring),定义一个SQL片断,该片断会被整个SQL语句所用到. 有时是为了让SQL语句的可读性更高些,也可能 ...
- 【译】高级T-SQL进阶系列 (三)【上篇】:理解公共表表达式(CTEs)
[译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正] 原文链接:传送门. 伴随着SQL SERVER 2005的首次展示,微软介绍了一种新的被称为“公共表 表达式”(CTE)的查询结构. ...
- DB2 公共表表达式(WITH语句的使用)
----start 说起WITH 语句,除了那些第一次听说WITH语句的人,大部分人都觉得它是用来做递归查询的.其实那只是它的一个用途而已,它的本名正如我们标题写的那样,叫做:公共表表达式(Commo ...
- 关于使用CTE(公用表表达式)的递归查询
--关于使用CTE(公用表表达式)的递归查询 --CTE 的基本语法结构如下: WITH expression_name [ ( column_name [,...n] ) ] AS ( CTE_qu ...
- with as (cte common table expression) 公共表表达式
SQL中 with as 的用法——使用公用表表达式(CTE) 公用表表达式 (CTE) 可以认为是在单个 SELECT.INSERT.UPDATE.DELETE 或 CREATE VIEW 语句的 ...
- 【转】CTE(公用表表达式)
本文转自:爽朗的微笑 http://www.cnblogs.com/shuangnet/archive/2013/03/22/2975929.html 公用表表达式 (CTE) 具有一个重要的优点, ...
- SQLServer中的CTE通用表表达式
开发人员正在研发的许多项目都涉及编写由基本的 SELECT/FROM/WHERE 类型的语句派生而来的复杂 SQL 语句.其中一种情形是需要编写在 FROM 子句内使用派生表(也称为内联视图)的 Tr ...
- Sql — CTE公用表表达式和With用法总结
CTE(Common Table Expression) 公用表表达式,它是在单个语句的执行范围内定义的临时结果集,只在查询期间有效.它可以自引用,也可在同一查询中多次引用,实现了代码段的重复利用. ...
- CTE(公用表表达式)
-> 将复杂的派生表写在中间from子句中变得十分臃肿,给为维护等操作带来麻烦 -> 将这个派生表要是能提前到前面,给一个别名,后面查询的时候直接使用别名即可语法: with 表的别名 a ...
随机推荐
- int(1)和int(11)是否有区别?
MySQL类型关键字后面的括号内指定整数值的显示宽度(例如,INT(11)).该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度.显示宽度并不限制可以在列内保存的值的范围,也不限制超过 ...
- linux常用文件
/etc/redhat-release /etc/hostname /etc/ssh/sshd_config /proc/meminfo /etc/issue 查看系统版本号 /etc/rc.d/rc ...
- 前端 HTML form表单标签 input标签 type属性 file 上传文件
加上上传文件功能 input type='file' - 依赖form表单里一个属性 enctype="multipart/form-data" 加上这个属性表示把你上次文件一点 ...
- finecms栏目文章页seo设置
finecms栏目页和文章页默认的标题是页面title_二级栏目title_一级栏目title_网站名称(比如:finecms怎么设置标题_finecms二次开发_finecms_ytkah博客),如 ...
- Tomcat7目录结构详解
1.bin:该目录下存放的是二进制可执行文件,如果是安装版,那么这个目录下会有两个exe文件:tomcat6.exe.tomcat6w.exe,前者是在控制台下启动Tomcat,后者是弹出UGI窗口启 ...
- 010-ThreadGroup线程组
线程组ThreadGroup表示一组线程的集合,一旦一个线程归属到一个线程组之中后,就不能再更换其所在的线程组.那么为什么要使用线程组呢?个人认为有以下的好处:方便统一管理,线程组可以进行复制,快速定 ...
- U盘复制文件到最后5秒会卡住怎么办解决
现在的U盘容量已经非常大了,一般都有16G以上,为了能放单文件大于4G的数据大多数时候我们都是把U盘格式化为ntfs格式的,所以会出现不管是大文件还是小文件,当你往U盘里复制文件或者使用发送到U盘功能 ...
- np.percentile()
np.percentile(a, q, axis=None, out=None, overwrite_input=False, interpolation='linear', keepdims=Fal ...
- python 判断字符串是否包含子字符串
第一种方法:in string = 'helloworld' if 'world' in string: print 'Exist' else: print 'Not exist' 第二种方法:fin ...
- cocos2d JS 利用定时器实现-倒计时功能
//创建一个定时器 cc.director.getScheduler().schedule(this, this.updates, 1, cc.REPEAT_FOREVER, 0, false, &q ...