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

原文链接:传送门

伴随着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. IN中超过1000处理

    后台 所有用到IN的方法,都要考虑超过1000的可能 if(cameraIds != null && cameraIds.length > 0){sql.append(" ...

  2. python3练习100题——012

    今天继续,答案都通过py3测试. 原题链接:http://www.runoob.com/python/python-exercise-example12.html 题目:判断101-200之间有多少个 ...

  3. centos7 walle2瓦力部署教程

    项目部署上线,如果是单服务器,那么有多种方式可以部署,比如直接ftp上传,或者直接git去拉取,人工操作也不会花费精力和时间,但是如果采用了集群模式,有多台服务器,那么依靠一台一台的去上传代码,就显得 ...

  4. 132. 分割回文串 II

    Q: 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回符合要求的最少分割次数. 示例: 输入: “aab” 输出: 1 解释: 进行一次分割就可将 s 分割成 [“aa”,“b ...

  5. python如何离线装包 离线如何部署python环境

    1,安装python windows: 我用的是python3.6.6.exe安装包,需要提前下载好 ubuntu: 自带的python,如果是ubuntu18.04的话,自带的应该是3.6.8 2, ...

  6. zookeeper入门之介绍与安装

    一:zookeeper是什么 What is ZooKeeper? ZooKeeper is a centralized service for maintaining configuration i ...

  7. laravel如何A表中包含B表中信息

    A表中如何包含B表中的信息 首先看A表的信息 接着看B表的信息 我的需求就是 A表字段name对应B表字段ream_name然后得到B表的对应主键ID要在A表中查询出来 发现问题就是查询出来的id和A ...

  8. JS高级---总结继承

    总结继承 面向对象特性: 封装, 继承,多态 继承, 类与类之间的关系, 面向对象的语言的继承是为了多态服务的   js不是面向对象的语言, 但是可以模拟面向对象,模拟继承,为了节省内存   继承: ...

  9. [蓝桥杯][基础训练]Sine之舞

    Description 最近FJ为它的奶牛开设了数学分析课,FJ知道,若要学好这门课,必须有一个好的三角函数基本功. 所以他为奶牛们做了一个“Sine之舞”的游戏,寓教于乐,提高奶牛的计算能力. 不妨 ...

  10. Unity Hub破解

    1.退出UnityHub,安装好nodejs后,用Win+R输入"cmd"执行以下命令 npm install -g asar 2.打开UnityHub安装目录如 C:\Progr ...