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

原文链接:传送门

伴随着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. 在MyEclipse中修改文件名出现问题

    问题描述:An exception has been caught while processing the refactoring 'Rename Compilation Unit'. 问题原因:项 ...

  2. sftp,ftp文件下载

    一.sftp工具类 package com.ztesoft.iotcmp.util; import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsc ...

  3. java基础异常处理

    异常的定义:中断了正常指令流的事件. try..catch..finally结构: class Test{ public static void main(String[] args){ System ...

  4. 03-Java基础语法【 流程控制语句】

    重要知识记录: 1.流程控制 顺序结构:根据编写的顺序,从上到下进行运行. 2.判断语句 1)判断语句1--if if(判断条件){ 执行语句: } 2)判断语句2--if...else if(判断条 ...

  5. python之路之css

    方式三 方式四 <style type="text/css"> a:link{ color: red; } a:visited { color: blue; } a:h ...

  6. python后续学习

    关于使用python输出中文字符的问题: Python中默认的编码格式是 ASCII 格式,在没修改编码格式时无法正确打印汉字,所以在读取中文时会报错. 解决方法为只要在文件开头加入 # -*- co ...

  7. wamp选择语言

    桌面右下角 右击绿色小图标 点击language选择chinese

  8. 问题 D: 家庭问题

    问题 D: 家庭问题 时间限制: 1 Sec  内存限制: 128 MB[命题人:admin] 题目描述 有n个人,编号为1,2,……n,另外还知道存在K个关系.一个关系的表达为二元组(α,β)形式, ...

  9. EntityFramework 根据时间筛选数据

    需求:根据当前时间,获取条件合适的数据,其中截止时间只比较日期. 1. 运行会报错的版本: var lifeWorkEventBatch = clientRepositoryContainer.Lif ...

  10. 协同ADMM求解考虑碳排放约束直流潮流问题的对偶问题(A Distributed Dual Consensus ADMM Based on Partition for DC-DOPF with Carbon Emission Trading)

    协同ADMM求解考虑碳排放约束直流潮流问题的对偶问题 (A Distributed Dual Consensus ADMM Based on Partition for DC-DOPF with Ca ...