来自:《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子句的更多相关文章

  1. sql中with的用法(CTE公用表表达式):应用子查询嵌套,提高sql性能

    一.WITH AS的含义 WITH AS短语,也叫子查询部分(subquery factoring),定义一个SQL片断,该片断会被整个SQL语句所用到. 有时是为了让SQL语句的可读性更高些,也可能 ...

  2. 【译】高级T-SQL进阶系列 (三)【上篇】:理解公共表表达式(CTEs)

    [译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正] 原文链接:传送门. 伴随着SQL SERVER 2005的首次展示,微软介绍了一种新的被称为“公共表 表达式”(CTE)的查询结构. ...

  3. DB2 公共表表达式(WITH语句的使用)

    ----start 说起WITH 语句,除了那些第一次听说WITH语句的人,大部分人都觉得它是用来做递归查询的.其实那只是它的一个用途而已,它的本名正如我们标题写的那样,叫做:公共表表达式(Commo ...

  4. 关于使用CTE(公用表表达式)的递归查询

    --关于使用CTE(公用表表达式)的递归查询 --CTE 的基本语法结构如下: WITH expression_name [ ( column_name [,...n] ) ] AS ( CTE_qu ...

  5. with as (cte common table expression) 公共表表达式

    SQL中 with as 的用法——使用公用表表达式(CTE)  公用表表达式 (CTE) 可以认为是在单个 SELECT.INSERT.UPDATE.DELETE 或 CREATE VIEW 语句的 ...

  6. 【转】CTE(公用表表达式)

    本文转自:爽朗的微笑  http://www.cnblogs.com/shuangnet/archive/2013/03/22/2975929.html 公用表表达式 (CTE) 具有一个重要的优点, ...

  7. SQLServer中的CTE通用表表达式

    开发人员正在研发的许多项目都涉及编写由基本的 SELECT/FROM/WHERE 类型的语句派生而来的复杂 SQL 语句.其中一种情形是需要编写在 FROM 子句内使用派生表(也称为内联视图)的 Tr ...

  8. Sql — CTE公用表表达式和With用法总结

    CTE(Common Table Expression) 公用表表达式,它是在单个语句的执行范围内定义的临时结果集,只在查询期间有效.它可以自引用,也可在同一查询中多次引用,实现了代码段的重复利用. ...

  9. CTE(公用表表达式)

    -> 将复杂的派生表写在中间from子句中变得十分臃肿,给为维护等操作带来麻烦 -> 将这个派生表要是能提前到前面,给一个别名,后面查询的时候直接使用别名即可语法: with 表的别名 a ...

随机推荐

  1. Erlang调度器

    1. Erlang 抢占式调度 Erlang实现公平调度基于Reduction Budget(运行次数限制).每一个进程创建时初始reduction budget值为2000,任何Erlang系统中的 ...

  2. vs2015智能提示英文改为中文

    vs2015智能提示英文改为中文 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework 进入 \v ...

  3. centos安装Django之二:pip3安装

    前面我们说到了centos安装Django之一:安装openssl,现在我们进入第二阶段pip3安装.两步实现:安装setuptools(pypi),安装pip,下面就和ytkah一起看看配置吧 1. ...

  4. Failed to load bundle(http://loaclhost:8081/index.bundle?platfrom=ios.....

    另外RN的创建的项目可能上架审核不太容易通过,祝你好运 1.可能当前同时运行多个项目,关闭一个项目就可以,或者重启 2.init 命令默认会创建最新的版本,而目前最新的 0.45 及以上版本需要下载 ...

  5. what's the 回撤

    什么是“回撤”? “回撤”是个谓语,前面隐含了一个主语.一般来说,没有人说“亏损回撤”的,我们说的“回撤”,通常指“股价回撤”.“市值回撤”.“净值回撤”和“盈利回撤”. “股价回撤”是针对个股的,即 ...

  6. [转载]MACD 各周期指标状态

    MACD指标:MACD指标是一个非常好用的指标,它与均线.量价关系配合使用对判断行情很有效.这里有必要再深一点讲MACD级别之间的作用. 一.首先,必须明白的是任何指标中都是大级别包含小级别,小级别对 ...

  7. Oracle(2)之多表查询&子查询&集合运算

    多表查询 笛卡尔积 同时查询多张表时,每张表的每条数据都要和其它表的每条数据做组合.如下栗子,我们发现产生的总记录数是 56 条,还发现 emp 表是 14 条,dept 表是 4 条,56 条正是 ...

  8. SSH服务知识

    1.ssh介绍 SSH 是 Secure Shell Protocol 的简写,由 IETF 网络工作小组(Network Working Group )制定:在进行数据传输之前,SSH先对联机数据包 ...

  9. js prototype分析

  10. windows server 2008 R2如何更换系统界面语言/中文换英文

    下面我们来讲解一下如何将中文系统转化成日文.韩文.英文等其它语言界面的系统. 以windows server 2008 R2系统中文变英文为例: 1.到微软官方下载:Windows Server 20 ...