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

---恢复内容开始---

伴随着SQL SERVER 2005的首次展示,微软介绍了一种新的被称为“公共表 表达式”(CTE)的查询结构。一个CTE是由一个简单查询定义的临时结果集,并且用在一个单独的 INSERT/UPDATE/DELETE/SELECT的作用域中。在这篇文章中,我将介绍如何定义以及使用 CTEs。

定义及使用CTEs

随着微软对CTEs的介绍,现在你有了一种不同的方式来构造和书写复杂的TSQL代码了。通过使用一个CTE你可以书写并且命名一个TSQL SELECT语句,并且随后便可以引用这个命名的TSQL,如同你就是在引用一个表或者视图一般。

下面是用来定义一个CTE的句法:

WITH <expression_name> (Column1, Column2, …) AS (CTE Definition)

在这里:

  • <expression_name> 是CTE的名字。
  • (Column1, Column2, …)是从CTE返回的列的名字(只有当列名没有提供,或者不是唯一的时候才是必须的)。
  • (CTE Definition)是一个SELECT语句,其定义了CTE的结果集。

一个CTE定义后面需要跟着一个单独的 INSERT/UPDATE/DELETE/SELECT语句,且其引用了这个命名的CTE。如果一个CTE是一个批处理语句的一部分,那么WITH子句前面的语句必须以一个分号结尾。

---恢复内容结束---

伴随着SQL SERVER 2005的首次展示,微软介绍了一种新的被称为“公共表 表达式”(CTE)的查询结构。一个CTE是由一个简单查询定义的临时结果集,并且用在一个单独的 INSERT/UPDATE/DELETE/SELECT的作用域中。在这篇文章中,我将介绍如何定义以及使用 CTEs。

定义及使用CTEs

随着微软对CTEs的介绍,现在你有了一种不同的方式来构造和书写复杂的TSQL代码了。通过使用一个CTE你可以书写并且命名一个TSQL SELECT语句,并且随后便可以引用这个命名的TSQL,如同你就是在引用一个表或者视图一般。

下面是用来定义一个CTE的句法:

WITH <expression_name> (Column1, Column2, …) AS (CTE Definition)

在这里:

  • <expression_name> 是CTE的名字。
  • (Column1, Column2, …)是从CTE返回的列的名字(只有当列名没有提供,或者不是唯一的时候才是必须的)。
  • (CTE Definition)是一个SELECT语句,其定义了CTE的结果集。

一个CTE定义后面需要跟着一个单独的 INSERT/UPDATE/DELETE/SELECT语句,且其引用了这个命名的CTE。如果一个CTE是一个批处理语句的一部分,那么WITH子句前面的语句必须以一个分号结尾。

当你定义多个CTE时候,引用了另一个CTE语句的CTE必须在其所引用 的CTE语句之后进行定义。

如下是一些不能在CTE中使用的子句:

  • ORDER BY (unless used with TOP clause)
  • INTO
  • OPTION clause with query hints
  • FOR XML
  • FOR BROWSE

递归CTE

递归处理是调用自身的一个处理过程。递归过程的每一次迭代都会返回结果集的一部分。递归过程会不断的调用自身直到找到了一个条件,其预示着不应该再调用自身,此时,递归结束。在SQL SERVER中,递归CTE的最终结果集是每次调用递归查询的所有结果集的总和。

一个CTE可以引用其自身,当这个过程结束时它便是一个递归CTE。

原文地址:https://www.cnblogs.com/qianxingmu/p/12051494.html

时间: 2024-10-29 10:41:32

【译】高级T-SQL进阶系列 (三)【上篇】:理解公共表表达式(CTEs)的相关文章

Spring Boot进阶系列三

Thymeleaf是官方推荐的显示引擎,这篇文章主要介绍怎么让spring boot整合Thymeleaf.  它是一个适用于Web和独立环境的现代服务器端Java模板引擎. Thymeleaf的主要目标是给开发工作流程带来优雅的自然模板 - 可以在浏览器中正确显示的HTML,也可以用作静态原型,从而在开发团队中实现更强大的协作.通过Spring Framework模块,与喜欢的工具的集成,Thymeleaf是HTML5 JVM Web开发的理想选择. 1.自然模板官方示例 用Thymeleaf

SQL进阶系列之7用SQL进行集合运算

写在前面 集合论是SQL语言的根基,因为这种特性,SQL也被称为面向集合语言 导入篇:集合运算的几个注意事项 注意事项1:SQL能操作具有重复行的集合(multiset.bag),可以通过可选项ALL来支持 SQL的集合运算符提供了允许重复和不允许重复两种用法,UNION和INTERSECT结果里不会出现重复的行,UNION ALL则会保留重复行:ALL的作用和SELECT子句中的DISTINCT相反.ALL有助于优化查询性能,这是因为使用ALL后不再进行排序 注意事项2:集合运算符存在优先级

SQL进阶系列之9用SQL处理数列

写在前面 关系模型的数据结构里,并没有顺序的概念,但SQL处理有序集合也有坚实的理论基础 生成连续编号 --生成连续编号 CREATE TABLE Digits (digit INTEGER PRIMARY KEY); INSERT INTO Digits VALUES (0); INSERT INTO Digits VALUES (1); INSERT INTO Digits VALUES (2); INSERT INTO Digits VALUES (3); INSERT INTO Digi

Linq To Sql进阶系列(六)用object的动态查询与保存log篇

动态的生成sql语句,根据不同的条件构造不同的where字句,是拼接sql 字符串的好处.而Linq的推出,是为了弥补编程中的 Data != Object 的问题.我们又该如何实现用object的动态查询呢? 1,用object的查询是什么?我们可以简单的举这么一个例子.我们到公安局查找一个人.首先,我们会给出他的一些特征,比如,身高多少,年龄多少,性别,民族等.那么,我们把这个人的一些特征输入电脑.我们希望,电脑能给我们返回这个人的信息.而实际上,有相同特征的人太多了,常常返回一个集合.那让

SQL进阶系列之8EXISTS谓词的用法

写在前面 支撑SQL和关系数据库的基础理论:数学领域的集合论和逻辑学标准体系的谓词逻辑 理论篇 什么是谓词?谓词是返回值为真值(true false unknown)的函数 关系数据库里,每一个行数据可以看作是一个命题 实体的阶层 0阶实体(单行) -- 1阶谓词( = between and) 1阶实体(行集合/表) -- 2阶谓词 (exists) 2阶实体(表的集合) -- 3阶谓词 1970被毙掉,目前数据库均以二阶谓词为基准 全称量化与存在量化 全称量词:所有的\(x\)都满足条件\(

sql server 使用公共表表达式(CTE)递归

1 with companyNodes(ParentNodeID,NodeID,NodeTypeID,level) as 2 ( 3 select n.ParentNodeID,n.NodeID,n.NodeTypeID,0 level 4 from tblclient_companyowner as o inner join tblSys_Node as n on o.NodeID=n.NodeID 5 where o.CompanyID=238 6 union all 7 select n.

高级T-SQL进阶系列 (一):使用 CROSS JOIN 介绍高级T-SQL

这是一个新进阶系列的第一篇文章,我们将浏览Transact-SQL(T-SQL)的更多高级特性.这个进阶系列将会包含一系列的文章,它们会扩展你在之前的两个TSQL进阶系列所掌握的TSQL的基础. TSQL DML 进阶 TSQL进阶:超越基础 本系列“高级Transact-SQL”将会包含如下T-SQL主题: 使用CROSS JOIN 操作符 使用APPLY操作符 理解通用表表达式(CTE's) 使用TSQL游标的记录级别处理 使用UNPIVOT实现列转行 使用排序函数对数据进行排序 使用相关函

SQL Server进阶(六)表表达式

概述 SQL Server支持四种类型的表表达式:派生表,公用表表达式,视图和内联表值函数. 派生表 派生表是一个查询结果生成的表,类似于临时表. 派生表可以简化查询,避免使用临时表.相比手动生成临时性能更优越.派生表与其他表一样出现在查询的FROM子句中 select * from (select * from athors) temp temp 就是派生表 派生出来的表必须要是一个有效的表.因此,它必须遵守以下几条规则: 1. 所有列必须要有名称 2. 列名称必须是要唯一 3. 不允许使用O

T-SQL查询进阶--详解公用表表达式(CTE)

简介 对于SELECT查询语句来说,通常情况下,为了使T-SQL代码更加简洁和可读,在一个查询中引用另外的结果集都是通过视图而不是子查询来进行分解的.但是,视图是作为系统对象存在数据库中,那对于结果集仅仅需要在存储过程或是用户自定义函数中使用一次的时候,使用视图就显得有些奢侈了. 公用表表达式(Common Table Expression)是SQL SERVER 2005版本之后引入的一个特性.CTE可以看作是一个临时的结果集,可以在接下来的一个SELECT,INSERT,UPDATE,DEL