---恢复内容开始---
伴随着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。