1 CTE语法WITH关键字

  通用表表达式(Common Table Express, CTE),将派生表定义在查询的最前面。要使用CTE开始创建一个查询,可以使用WITH关键字。

  CTE语法:

WITH <expression_name> [(column_name [,...n])]
AS
( CTE_query_definition)
[, <another_expression>]
<query>

  首先为CTE提供一个名称,该名称类似于用于派生表的别名。然后可以提供CTE将返回的列名列表;如果CTE指定了它的所有返回列,则这是可选操作。最后,在圆括号中添加CTE查询的定义,最后添加使用CTE的主查询。

  WITH关键字之前的语句必须使用分号(;)结束。

  示例

WITH cte
AS
(
SELECT * FROM [dbo].[Product]
) SELECT [ProductID],[ProductCode],[ProductName],[UnitPrice] FROM cte

  连接查询示例

WITH ProductCTE([CategoryID], [ProductsCount])
AS
(
SELECT [CategoryID],COUNT(1)
FROM [dbo].[Product]
GROUP BY [CategoryID]
) SELECT c.[CategoryID],c.[CategoryName], cte.[ProductsCount]
FROM [dbo].[Category] c
INNER JOIN ProductCTE cte
ON c.[CategoryID] = cte.[CategoryID]
ORDER BY cte.[ProductsCount]

2 使用多个CTE

  使用WITH开始语句可以定义多个CTE,不需要重复使用WITH关键字,每一个CTE可以使用在该语句中已经定义的任意CTE(作为其定义的一部分)。

WITH CategoryCTE
AS
(
SELECT * FROM [dbo].[Category]
),ProductCTE
AS
(
SELECT p.*,cte.[CategoryName] FROM [dbo].[Product] p
INNER JOIN CategoryCTE cte
ON p.[CategoryID] = cte.[CategoryID]
) SELECT * FROM ProductCTE

3 递归CTE

  递归公用表表达式是在CTE内的语句中调用其自身的CTE。

  示例

WITH cte([CategoryID],[CategoryName],[ParentID],[Level])
AS
(
-- 查询语句
SELECT [CategoryID],[CategoryName],[ParentID],1 AS [Level] FROM [dbo].[Category]
WHERE [ParentID] IS NULL
UNION ALL
-- 递归语句
SELECT c.[CategoryID],c.[CategoryName],c.[ParentID], cte.[Level] + 1
FROM [dbo].[Category] c
INNER JOIN cte
ON c.[CategoryID] = cte.[ParentID]
) SELECT [CategoryID],[CategoryName],[ParentID],[Level] FROM cte

  限制递归层次

WITH cte([CategoryID],[CategoryName],[ParentID],[Level])
AS
(
-- 查询语句
SELECT [CategoryID],[CategoryName],[ParentID],1 AS [Level] FROM [dbo].[Category]
WHERE [ParentID] IS NULL
UNION ALL
-- 递归语句
SELECT c.[CategoryID],c.[CategoryName],c.[ParentID], cte.[Level] + 1
FROM [dbo].[Category] c
INNER JOIN cte
ON c.[CategoryID] = cte.[ParentID]
) SELECT [CategoryID],[CategoryName],[ParentID],[Level] FROM cte
OPTION(MAXRECURSION 2)

  Where过滤递归结果数据层次

WITH cte([CategoryID],[CategoryName],[ParentID],[Level])
AS
(
-- 查询语句
SELECT [CategoryID],[CategoryName],[ParentID],1 FROM [dbo].[Category]
WHERE [ParentID] IS NULL
UNION ALL
-- 递归语句
SELECT c.[CategoryID],c.[CategoryName],c.[ParentID], [Level] + 1
FROM [dbo].[Category] c
INNER JOIN cte
ON c.[CategoryID] = cte.[ParentID]
) SELECT [CategoryID],[CategoryName],[ParentID],[Level] FROM cte
WHERE cte.[Level] <= 3

Sql Server系列:通用表表达式CTE的更多相关文章

  1. sql server使用公用表表达式CTE通过递归方式编写通用函数自动生成连续数字和日期

    问题:在数据库脚本开发中,有时需要生成一堆连续数字或者日期,例如yearly report就需要连续数字做年份,例如daily report就需要生成一定时间范围内的每一天日期.而自带的系统表mast ...

  2. SQL Server CET 通用表表达式 之 精典递归

    SQL2005 Common Table Expressions(CET)即通用表表达式. SQLSERVER CET递归使用案例: 1.普通案例 表结构如下:   ;WITH cet_depart ...

  3. SQL Server中公用表表达式 CTE 递归的生成帮助数据,以及递归的典型应用

    本文出处:http://www.cnblogs.com/wy123/p/5960825.html 我们在做开发的时候,有时候会需要一些帮助数据,必须需要连续的数字,连续间隔的时间点,连续的季度日期等等 ...

  4. SQL Server温故系列(3):SQL 子查询 & 公用表表达式 CTE

    1.子查询 Subqueries 1.1.单行子查询 1.2.多行子查询 1.3.相关子查询 1.4.嵌套子查询 1.5.子查询小结及性能问题 2.公用表表达式 CTE 2.1.普通公用表表达式 2. ...

  5. sql server编写简洁四则运算表达式脚本实现计算批次功能(C#等其它编程语言也能直接用此通用表达式)

    问题: 在数据库编程开发中,有时会遇到数据量比较大的情况,如果直接大批量进行添加数据.修改数据.删除数据,就会是比较大的事务,事务日志也比较大,耗时久的话会对正常操作造成一定的阻塞.虽不至于达到删库跑 ...

  6. SQLServer中的CTE(Common Table Expression)通用表表达式使用详解

    概述 我们经常会编写由基本的 SELECT/FROM/WHERE 类型的语句派生而来的复杂 SQL 语句.其中一种方案是需要编写在 FROM 子句内使用派生表(也称为内联视图)的 Transact-S ...

  7. SQLServer中的CTE通用表表达式

    开发人员正在研发的许多项目都涉及编写由基本的 SELECT/FROM/WHERE 类型的语句派生而来的复杂 SQL 语句.其中一种情形是需要编写在 FROM 子句内使用派生表(也称为内联视图)的 Tr ...

  8. SQL Server系列目录

    一.SQL Server基础部分 1  数据库概念及规范化设计 1.1 数据库物理模式设计 1.2 Microsoft SQL Server Management Studio模板资源管理器 2 数据 ...

  9. 公用表表达式 (CTE)、递归、所有子节点、sqlserver

    指定临时命名的结果集,这些结果集称为公用表表达式 (CTE).公用表表达式可以包括对自身的引用.这种表达式称为递归公用表表达式. 对于递归公用表达式来说,实现原理也是相同的,同样需要在语句中定义两部分 ...

随机推荐

  1. spark scala学习笔记

    搞清楚几个概念: 闭包 柯里化 搭建了intellij idea 的scala 开发环境

  2. [译]App Framework 2.1 (2)之 Get Involved

    App Framework  API 第二篇 原文在此:http://app-framework-software.intel.com/documentation.php#intro/involved ...

  3. XDocument获取指定节点

    string xmlFile = @"D:\Documents\Visual Studio 2013\Projects\Jesee.Web.Test\ConsoleApplication1\ ...

  4. sql server的优缺点

    sql server的优点众多,让其在数据库领域独占鳌头,成为最受欢迎的数据库系统,其优缺点也自然是喜爱者们所关注的,首先了解一下它的历史: sql server是一个关系型数据库管理系统,最初是由M ...

  5. 获取img的真实宽高

    之前项目后台上传图片时需要对图片的宽高做限制,一开始百度了之后使用js进行判断,可是这种方式存在一定问题,后来就改在后台判断了.现在吧这两种方式都贴出来. 一.用js获取: 先说第一个方法:obj.s ...

  6. IDEA+Tomcat+JRebel热部署

    在完成idea工程简单应用后,接下来实现热部署. 简单应用地址:http://wibiline.iteye.com/admin/blogs/2072454 一.安装JRebel插件 1. 在线安装 F ...

  7. 二、JSP、servlet、SQL三者之间的数据传递(前台与后台数据交互)

    2.收信息来到表单提交时URL所指向的servlet文件,获取传递过来的参数值

  8. javascript keycode大全

    keycode    8 = BackSpace BackSpacekeycode    9 = Tab Tabkeycode   12 = Clearkeycode   13 = Enterkeyc ...

  9. java的值传递笔记

    1. 背景:开发小伙伴突然问我java是值传递还是引用传递,我说当然是值传递,只不过有时候传递一个对象时实际传递的是对象的地址值,所以让人容易产生一种引用传递的假象,貌似在李刚的疯狂java讲义有提到 ...

  10. Webform Application传值 ViewState

    Application:所有的会话共享一个Application空间,任何一个人改变Application的内容,其他人都会发现被改变了.Application中的内容不会被自动释放 存放位置:服务端 ...