【译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正】

原文链接:传送门

伴随着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。一个递归CTE至少包含两个查询定义,其都是SELECT语句。一个查询定义被称为锚点成员,而另一个查询定义被成为递归成员。一个锚点成员查询定义不会引用一个CTE而一个递归成员会引用一个CTE。除此之外,一个锚点成员查询在一个CTE中会先于一个递归成员查询而出现。从锚点成员返回的列的数目必须要和从递归成员返回的列的数目保持一致。可以有多个锚点查询定义,它们使用这些操作符中的一个进行组合:UNION ALL, UNION, INTERSECT, or EXCEPT。同样也可以有多个递归查询定义。每一个递归查询定义必须要用UNION ALL操作符组合起来。UNION ALL操作符同样也用来连接最后一个锚点查询定义与第一个递归查询定义。同样的,当我们看一些例子时这会变得更加清晰。

对于CTE以及递归CTE我们已经做了足够的讨论,现在让我们来看一些CTE的例子。

To be continued...

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

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

    [译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正] 原文链接:传送门. 一个简单的CTE例子 如前所述,CTE‘s提供给你了一个方法来更容易的书写复杂的代码以提高其可读性.假设你有列表 ...

  2. Bing Maps进阶系列三:使用地图图像服务(ImageryService)

    Bing Maps进阶系列三:使用地图图像服务(ImageryService) 地图图像服务(ImageryService)提供了根据地理位置(经度和纬度)坐标和地图的缩放级别解析出对应于地图图片系统 ...

  3. Spring Boot进阶系列三

    Thymeleaf是官方推荐的显示引擎,这篇文章主要介绍怎么让spring boot整合Thymeleaf.  它是一个适用于Web和独立环境的现代服务器端Java模板引擎. Thymeleaf的主要 ...

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

    写在前面 关系模型的数据结构里,并没有顺序的概念,但SQL处理有序集合也有坚实的理论基础 生成连续编号 --生成连续编号 CREATE TABLE Digits (digit INTEGER PRIM ...

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

    写在前面 集合论是SQL语言的根基,因为这种特性,SQL也被称为面向集合语言 导入篇:集合运算的几个注意事项 注意事项1:SQL能操作具有重复行的集合(multiset.bag),可以通过可选项ALL ...

  6. SQL进阶系列之5外连接的用法

    写在前面 SQL本身是作为一种数据提取工具而出现,使用SQL生成各种定制化报表和非定制化报表并非SQL原本用途的功能,但这并不意味着SQL无法实现这些功能. 用外连接进行行列转换(1)(行 → 列): ...

  7. SQL进阶系列之3三值逻辑与NULL

    写在前面 普通编程语言里的布尔型只有true和false两个值,这种逻辑体系被称为二值逻辑,而SQL语言里,还有第三个值unknown,因此SQL的逻辑体系被称为三值逻辑. Why SQL存在三值逻辑 ...

  8. 进阶系列三【绝对干货】----Log4.Net的介绍

    一.介绍 当我们开发软件时,一般都会加入运行期的跟踪手段,以方便后续故障分析和Bug调试..net framework本身提供了一个System.Diagnostics.Trace类来实现流程跟踪功能 ...

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

    动态的生成sql语句,根据不同的条件构造不同的where字句,是拼接sql 字符串的好处.而Linq的推出,是为了弥补编程中的 Data != Object 的问题.我们又该如何实现用object的动 ...

随机推荐

  1. C++-对象指针的滥用

    C++ 中经常出现使用对象指针,而不是直接使用对象本身的代码,比如下面这个例子: Object *myObject = new Object; 而不是使用: myObject.testFunc(); ...

  2. Javaweb项目不需要端口号及项目名的访问配置(已备注)

    1.不需要端口号的配置: 在server.xml中找到节点: <Connector URIEncoding="UTF-8" connectionTimeout="2 ...

  3. C#中字节数组byte[]和字符串string类型的相互转换

    C#中字节数组byte[]和字符串string类型的相互转换: string转byte[]: byte[] byteArray = System.Text.Encoding.Default.GetBy ...

  4. 题解 Fractal Streets

    题目链接 参考博客 #include<cstdio> #include<math.h> #include<utility>//pair using namespac ...

  5. Python3标准库:string通用字符串操作

    1. string:通用字符串操作 string模块在很早的Python版本中就有了.以前这个模块中提供的很多函数已经移植为str对象的方法,不过这个模块仍保留了很多有用的常量和类来处理str对象. ...

  6. tp5.1 Auth类实现权限管理

    了解来这么久权限控制权限的知识,却不知道如何写代码,网上的代码多数并没有多少完整的源码能提供参考.偶然看到官网的例子,现在终于也把源码的实现也弄得明白了一点. tp5框架的Auth类可以实现页面的访问 ...

  7. pandas 数据可视化之折线图

    官网地址:https://openpyxl.readthedocs.io/en/stable/charts/line.html#id1 openpyxl+pandas # coding=utf-8 i ...

  8. liunx详解-2

    linux安装与配置 安装配置 虚拟机配置1G内存,1核CPU,50G硬盘,网络地址转换(NAT,主机作为路由构建内网) 镜像文件:http://mirror.nsc.liu.se/centos-st ...

  9. 存储过程(Stored Procedure)

    存储过程中 IN,OUT,INOUT类型参数的区别 IN:输入参数:表示该参数的值必须在调用存储过程时指定赋值,在存储过程中修改该参数的值不能被返回,为默认值 OUT:在存储过程内部,该值的默认值为N ...

  10. Euler Sums系列(六)

    \[\Large\displaystyle \sum_{n=1}^{\infty}\frac{H_{2n}}{n(6n+1)}\] \(\Large\mathbf{Solution:}\) Let \ ...